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

如何创建一个可以将密钥发送到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的关注,那么这将是一种可以完成的方式。 我不知道怎么做,我对不同的方式感兴趣。

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

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

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

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

有没有办法在不使用inheritance的情况下在Control上调用SetStyle

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

 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将不可inheritance而不可选。