gpt4 book ai didi

c# - 如何创建一个 Button,它可以在不窃取焦点的情况下将键发送到控件 - Virtual Keyboard

转载 作者:太空狗 更新时间:2023-10-30 01:01:47 26 4
gpt4 key购买 nike

我怎样才能制作一个可以将键发送到 datagridview 的按钮(所以我需要以某种方式将 datagridview 返回到它失去焦点之前的状态)

我来解释一下

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

enter image description here

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

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

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

我希望用户能够使用按钮将数据输入数据网格。

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

我不知道如何实现。

我有一个想法.. 如果有一种方法可以注册鼠标悬停在按钮上并按下点击,但又不会失去对 datagridview 的关注,那么这就是可以完成的一种方法。虽然我不知道该怎么做,但我对不同的方式很感兴趣。

最佳答案

不可选择的按钮来像虚拟键盘一样发送键

制作一个不可选择的按钮然后处理它的点击事件和发送键就足够了。通过这种方式,这些按钮可以像虚拟键盘键一样工作,并且焦点将保留在具有焦点的控件上,同时它将键发送到焦点控件。

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

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

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

控件的 SetStyle 扩展方法

Is there any way of calling SetStyle on a Control without using inheritance?

是的,使用 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 将是不可选择的。

关于c# - 如何创建一个 Button,它可以在不窃取焦点的情况下将键发送到控件 - Virtual Keyboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36771882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com