winform datagridview失去焦点的时候怎么添加行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform datagridview失去焦点的时候怎么添加行相关的知识,希望对你有一定的参考价值。
当DataGridView失去焦点的时候需要添加行,但会报错,谁知道怎么添加
不能自动添加行
失去焦点的事件里不能添加行
看有没有更好的办法添加一行
以下是我的测试代码,你注意下 if( ds.Tables["UserInfo"] != null ),因为我是在窗体载入的时候实例化 ds的,所以首次触发dataGridView1_Leave事件时 ds为空。
也许你就说的错误就是这个。
if( ds.Tables["UserInfo"] != null )
DataRow dr = ds.Tables["UserInfo"].NewRow();
dr["ACCEPT_FLOW"] = 1;
dr["CASE_FLOW"] = 1;
ds.Tables["UserInfo"].Rows.Add( dr );
dataGridView1.Refresh();
参考技术A 失去焦点? 这个跟代码处理添加行不冲突。
如果楼主说的是:“失去焦点”这个事件引发添加行的处理,那这个得看datagridview控件是否自带了这个事件,如果没有,则考虑自定义事件。 参考技术B datagridview绑定的数据添加新行,再次绑定
如何创建一个可以将键发送到控件而不会失去焦点的按钮 - 虚拟键盘
【中文标题】如何创建一个可以将键发送到控件而不会失去焦点的按钮 - 虚拟键盘【英文标题】:How to create a Button that can send keys to a conrol without losing focus - Virtual Keyboard 【发布时间】:2018-05-31 14:42:39 【问题描述】:如何制作一个可以将键发送到 datagridview 的按钮(因此我需要在 datagridview 失去焦点之前以某种方式将其返回到其状态)
我会解释问题
我有一个带有 datagridview 和一些按钮的表单
我可以点击按钮,它会输入相应的字母,
dataGridView1.Focus();
SendKeys.Send("a"); //or m or z, depending on the text of the button.
该按钮用于将数据输入到 datagridview 中。我可以让它只有在调用 datagridview 的 enter 方法时才启用。单击按钮时,datagridview 会失去焦点,因此在发送密钥之前,我必须再次赋予它焦点。因此上面的两行。
我希望用户能够使用按钮将数据输入数据网格。
问题是,假设我希望用户能够输入文本“maz”,但我做不到。我只得到一个单独的 a 或 m 或 z。即使我可以将单元格重新置于可编辑模式,我也需要记住光标的位置。所以如果有人在单元格中输入 asdf 并将光标放在 d 和 f 之间,然后单击 m,我想要它说 asdmf。
我不知道该怎么做。
我有一个想法.. 如果有一种方法可以注册鼠标悬停在按钮上并且单击被按下,但又不会失去对 datagridview 的关注,那么这将是一种可以完成的方法。不过我不知道该怎么做,而且我对不同的方式感兴趣。
【问题讨论】:
是否有理由必须使用 sendkeys 而不是修改单元格(或底层绑定对象)的内容? 我想它可以修改单元格的内容,但仍然存在单击按钮会导致失去焦点从而失去光标位置的问题,所以如果我想让 asdf 成为 asdmf 我不看看如何。 【参考方案1】:不可选择的按钮来像虚拟键盘一样发送按键
制作一个不可选择的按钮然后处理它的点击事件和发送键就足够了。这样,这些按钮可以像虚拟键盘键一样工作,并且焦点将保持在具有焦点的控件上,同时将键发送到焦点控件。
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 在没有继承的情况下将是不可选择的。
【讨论】:
有什么方法可以在不使用继承的情况下在按钮上执行SetStyle(ControlStyles.Selectable, false);
使其不可选择?
@barlop 是的,有。我编辑了帖子以使答案对您有用。
顺便说一句,因为我找不到重复的问题 是否有任何方法可以在不使用继承的情况下在控件上调用 SetStyle?,我认为最好问它是一个新问题,我将在那里发布编辑。这样,这个问题对未来的读者会更有用。
使用反射的代码同样可以工作,无需将其放入扩展方法中。可能同时介绍这两个概念有点过分!
@barlop 删除 this
以便 SetStyle 将 Control 作为常规参数。然后,如果您将 SetStyle 放在名为 Misc 的类中,您将调用 Misc.SetStyle(button1, ControlStyles.Selectable, false)
。以上是关于winform datagridview失去焦点的时候怎么添加行的主要内容,如果未能解决你的问题,请参考以下文章
winform中datagridview怎么添加行之后将焦点选中在新添加的行?
如何创建一个可以将键发送到控件而不会失去焦点的按钮 - 虚拟键盘
Winform中Treeview控件失去焦点,如何将选择的节点还设置为高亮显示?