如何创建一个可以将键发送到控件而不会失去焦点的按钮 - 虚拟键盘

bar*_*lop 4 .net c# datagridview winforms

如何创建一个可以将密钥发送到datagridview的按钮(所以我需要以某种方式将datagridview返回到它失去焦点之前的状态)

我会解释这个问题

我有一个带有datagridview和一些按钮的表单

在此输入图像描述

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

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

该按钮用于将数据输入datagridview.我可以这样做,只有在调用datagridview的enter方法时才启用它.单击该按钮时,datagridview失去焦点,因此我必须在发送密钥之前再次给它焦点.因此上面两行.

我希望用户能够使用按钮将数据输入到datagrid中.

问题是,假设我希望用户能够输入文本"maz"我无法做到.我只得到个人a或m或z.即使我可以将单元格放回可编辑模式,我也需要记住光标所在的位置.所以如果有人将asdf键入单元格并将光标放在d和f之间,然后单击m,我想要它说asdmf.

我不知道如何做到这一点.

我有一个想法..也许如果有一种方法可以注册鼠标在按钮上并且按下了点击,但不会失去对datagridview的关注,那么这将是一种可以完成的方式.我不知道怎么做,我对不同的方式感兴趣.

Rez*_*aei 5

它足以制作一个不可选择的按钮,然后处理它的点击事件和发送密钥.这样,这些按钮可以像虚拟键盘键一样工作,并且焦点将保留在具有焦点的控件上,同时它将键发送到聚焦控件.

public class ExButton:Button
{
    public ExButton()
    {
        SetStyle(ControlStyles.Selectable, false);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后处理点击事件并发送密钥:

private void exButton1_Click(object sender, EventArgs e)
{
    SendKeys.SendWait("A");
}
Run Code Online (Sandbox Code Playgroud)

有没有办法SetStyleControl不使用继承的情况下调用它?

就在这里.创建此扩展方法:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在表单Load事件中以这种方式使用它:

this.button1.SetStyle(ControlStyles.Selectable, false);
Run Code Online (Sandbox Code Playgroud)

然后button1将不可继承而不可选.