C# DataGridView控件中正在吞没/未执行Keydown事件
我对基于本文开发的一些代码有问题 我想允许用户向Dataviewgrid控件添加一行,但发现通过启用C# DataGridView控件中正在吞没/未执行Keydown事件,c#,datagridview,keydown,C#,Datagridview,Keydown,我对基于本文开发的一些代码有问题 我想允许用户向Dataviewgrid控件添加一行,但发现通过启用AllowUserToAddress,这会导致在新行的新单元格中键入第一个字符后立即显示另一行。这会让我可怜的用户感到困惑,因此为了防止这种情况发生,我使用上面文章中的代码在每次击键时立即禁用allowUserToAddress(尽管我更希望只在键入第一个字符后执行)。然而,这似乎吞掉了输入的第一个字符,即。它不会传递给基类进行处理。以下是完整的代码: public sealed class XD
AllowUserToAddress
,这会导致在新行的新单元格中键入第一个字符后立即显示另一行。这会让我可怜的用户感到困惑,因此为了防止这种情况发生,我使用上面文章中的代码在每次击键时立即禁用allowUserToAddress
(尽管我更希望只在键入第一个字符后执行)。然而,这似乎吞掉了输入的第一个字符,即。它不会传递给基类进行处理。以下是完整的代码:
public sealed class XDataGridView : DataGridView
{
private bool _singleUpdateOnly = true;
public bool SingleUpdateOnly
{
get { return _singleUpdateOnly; }
set { _singleUpdateOnly = value; }
}
[Description("Disallows user adding rows as soon as a key is struck to ensure no blank row at bottom of grid")]
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if (SingleUpdateOnly)
{
AllowUserToAddRows = false;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
为什么我输入的第一个字符会被吞下?我怎样才能防止这种情况发生?有没有比我编写的更好的方法?我在这个论坛和其他论坛上对这个问题几乎没有什么回应。这一定是一个非常困难的问题,或者我只是对DataGridView控件期望过高。 经过几个小时的反复试验,我已经找到了一个不需要子类化的解决方案。解决方案并不完全是我想要的,也就是说,一旦用户开始在新添加的行中键入内容,就可以防止另一行被追加到网格底部,但这很接近。我使用
CellLeave
事件关闭AllowUserToAddress
。当用户按Tab键或Enter键将数据输入第一个单元格时,这将有效地从网格中删除新添加的行,将用户留在网格中新添加(最后)行的下一个单元格中(下面没有空行)。不优雅,但至少大部分是功能性的。代码如下:
private void uxContactEmailAddressesGrd_CellLeave(object sender, DataGridViewCellEventArgs e)
{
uxContactEmailAddressesGrd.AllowUserToAddRows = false;
}
也许有一天其他人会遇到这个问题,找到一个比我更优雅的解决方案。那太好了。确保将您的解决方案发布到此网站供其他人使用。建议:您可以
allowUserToAddress=false
并添加一些按钮
比如说addButton
,在按钮的单击事件中,dataGridView1.Rows.add()
并禁用addButton
,而用户正在修改且尚未完成一行并再次启用。@spajce Thks,我尝试过,但在数据绑定网格上不可能这样做。