Как создать кнопку, которая может отправлять ключи на консоль без потери фокуса - Виртуальная клавиатура

Как сделать кнопку, которая может отправлять ключи в сетку данных (поэтому мне нужно как-то вернуть сетку данных в ее состояние до того, как она потеряет фокус)

Я объясню проблему

У меня есть форма с сеткой данных и некоторыми кнопками

Я могу нажать на кнопку, и она введет соответствующую букву,

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 будет недоступен для выбора без наследования.

Другие вопросы по тегам