Вопрос:

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

c# .net winforms datagridview

779 просмотра

1 ответ

5175 Репутация автора

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

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

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

введите описание изображения здесь

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

dataGridView1.Focus();
SendKeys.Send("a");  //or m or z, depending on the text of the button.

Кнопка предназначена для ввода данных в просмотр данных. Я мог бы сделать так, чтобы он был включен только при вызове метода ввода datagridview. Когда кнопка нажата, то сетка данных теряет фокус, поэтому я должен снова сфокусировать ее перед отправкой ключа. Отсюда две строчки выше.

Я хочу, чтобы пользователь мог использовать кнопки для ввода данных в сетку данных.

Проблема, скажем, в том, что я хочу, чтобы пользователь мог вводить текст "maz", но я не могу этого сделать. Я получаю только человека а или м или я. И даже если бы я мог вернуть ячейку обратно в редактируемый режим, мне нужно было бы вспомнить, где находился курсор. Так что, если бы кто-нибудь набрал в ячейке asdf и поместил курсор между d и f и нажал m, я бы хотел это сказать asdmf.

Я не знаю, как этого добиться.

У меня есть идея ... что, возможно, если бы был способ зарегистрировать, что мышь была над кнопкой, и щелчок был нажат, но без потери фокуса на просмотре данных, это был бы один из способов сделать это. Хотя я не знаю, как это сделать, и меня интересуют разные способы.

Автор: barlop Источник Размещён: 21.04.2016 01:56

Ответы (1)


5 плюса

76072 Репутация автора

Решение

Невыбираемая кнопка для отправки ключа, как виртуальная клавиатура

Достаточно сделать невыбираемую кнопку, а затем обработать событие щелчка и отправить ключ. Таким образом, эти кнопки могут работать как клавиши виртуальной клавиатуры, и фокус останется на элементе управления, который имеет фокус, в то время как он отправляет ключ на элемент управления с фокусом.

public class ExButton:Button
{
    public ExButton()
    {
        SetStyle(ControlStyles.Selectable, false);
    }
}

Затем обработайте событие клика и отправьте ключ:

private void exButton1_Click(object sender, EventArgs e)
{
    SendKeys.SendWait("A");
}

Метод расширения SetStyle для элемента управления

Есть ли способ вызова SetStyleна Controlбез использования наследования?

Да, используя Reflection , есть. Создайте этот метод расширения:

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

Автор: Reza Aghaei Размещён: 21.04.2016 03:04
Вопросы из категории :
32x32