Как создать кнопку, которая может отправлять ключи на консоль без потери фокуса - Виртуальная клавиатура
Как сделать кнопку, которая может отправлять ключи в сетку данных (поэтому мне нужно как-то вернуть сетку данных в ее состояние до того, как она потеряет фокус)
Я объясню проблему
У меня есть форма с сеткой данных и некоторыми кнопками
Я могу нажать на кнопку, и она введет соответствующую букву,
dataGridView1.Focus();
SendKeys.Send("a"); //or m or z, depending on the text of the button.
Кнопка предназначена для ввода данных в таблицу данных. Я мог бы сделать так, чтобы он был включен только при вызове метода ввода datagridview. Когда кнопка нажата, то сетка данных теряет фокус, поэтому я должен снова сфокусировать ее перед отправкой ключа. Отсюда две строчки выше.
Я хочу, чтобы пользователь мог использовать кнопки для ввода данных в сетку данных.
Проблема, скажем, в том, что я хочу, чтобы пользователь мог вводить текст "маз", но я не могу этого сделать. Я получаю только индивидуальный а или м или я. И даже если бы я мог вернуть ячейку обратно в редактируемый режим, мне нужно было бы вспомнить, где находился курсор. Так что, если бы кто-то набрал в ячейке asdf и поместил курсор между d и f и щелкнул m, я бы хотел это сказать asdmf.
Я не знаю, как этого добиться.
У меня есть идея... что, возможно, если бы был способ зарегистрировать, что мышь была над кнопкой, и щелчок был нажат, но не теряя фокус на просмотре данных, то это было бы одним из способов сделать это. Хотя я не знаю, как это сделать, и меня интересуют разные способы.
1 ответ
Достаточно сделать невыбираемую кнопку, а затем обработать событие нажатия и отправить ключ. Таким образом, эти кнопки могут работать как клавиши виртуальной клавиатуры, и фокус останется на элементе управления, который имеет фокус, в то время как он отправляет ключ на элемент управления с фокусом.
public class ExButton:Button
{
public ExButton()
{
SetStyle(ControlStyles.Selectable, false);
}
}
Затем обработайте событие клика и отправьте ключ:
private void exButton1_Click(object sender, EventArgs e)
{
SendKeys.SendWait("A");
}
Есть ли способ позвонить
SetStyle
наControl
без использования наследства?
Да, есть. Создайте этот метод расширения:
public static class Extensions
{
public static void SetStyle(this Control control, ControlStyles flags, bool value)
{
Type type = control.GetType();
BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
MethodInfo method = type.GetMethod("SetStyle", bindingFlags);
if (method != null)
{
object[] param = { flags, value };
method.Invoke(control, param);
}
}
}
Тогда используйте это таким образом, в вашей форме Load
событие:
this.button1.SetStyle(ControlStyles.Selectable, false);
Тогда button1 будет недоступен для выбора без наследования.