winforms 如何创建一个按钮,可以发送键到一个控件,而不窃取焦点-虚拟键盘

rvpgvaaj  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(176)

我如何制作一个按钮,可以将键发送到DataGridView中(因此我需要以某种方式将DataGridView返回到它失去焦点之前的状态)
我来解释这个问题
我有一个带有datagridview和一些按钮的窗体

我可以点击按钮,它会输入相应的字母,

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

这个按钮是用来向datagridview输入数据的,我可以让它只在datagridview的enter方法被调用时才被启用,当这个按钮被点击时,datagridview就会失去焦点,所以我必须在发送键之前再次给予它焦点,因此上面有两行。
我希望用户能够使用按钮将数据输入到DataGrid中。
问题是,假设我想让用户能够输入文本“maz”,我做不到。我只得到了一个单独的a或m或z。即使我可以将一个单元格恢复到可编辑模式,我也需要记住光标在哪里。因此,如果有人在一个单元格中键入asdf,并将光标放在d和f之间,然后单击m,我希望它显示asdmf。
我不知道该怎么做。
我有一个想法...也许有一种方法可以注册鼠标在按钮上,点击被按下,但不会失去对datagridview的关注,那么这将是一种可以做到的方法,但我不知道如何做到这一点,我对不同的方法感兴趣。

daupos2t

daupos2t1#

发送键不可选按钮,如虚拟键盘

创建一个不可选择的按钮,然后处理它的click事件和send键就足够了。这样这些按钮就可以像虚拟键盘键一样工作,并且焦点将保持在有焦点的控件上,同时它将键发送到有焦点的控件。

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

然后处理点击事件和发送按键:

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

控件的SetStyle扩展方法

有没有办法在Control上调用SetStyle而不使用继承?
是的,使用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将在没有继承的情况下不可选。

相关问题