我在根据文章DataGridView keydown event not working in C#开发的一些代码时遇到了问题。
我想允许用户向Dataviewgrid控件添加一行,但发现通过启用AllowUserToAddRows
这导致在第一个字符被输入到新单元格中时会显示另一行新排。这对我的可怜的用户来说会让人感到困惑,所以为了防止这种情况,我使用上面的代码在每次击键时立即禁用AllowUserToAddRows
(虽然最好只在输入第一个字符后执行此操作)。然而,这似乎吞下了第一个char类型,i,.e。它不会传递到基类进行处理。这是完整的代码:
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);
}
}
为什么第一个字体我被吞下了?我怎样才能防止这种情况发生?有没有比我编码的更好的方法?
答案 0 :(得分:0)
我对这个论坛和其他人的回答很少。它一定是一个非常棘手的问题,或者我只是期望从 DataGridView 控件中获得太多。
经过几个小时的反复试验,我已经找到了一个不需要子类化的解决方案。解决方案并不是我想要的,即一旦用户开始输入新添加的行,就防止另一行被附加到网格的底部,但它接近了。我使用CellLeave
事件来关闭AllowUserToAddRows
。当用户按Tab或Enter键将数据输入第一个单元格时,这有效地从网格中删除新添加的行,将用户留在网格新添加的(最后一行)的下一个单元格中(下面没有空行) )。不优雅,但至少大部分功能。这是代码:
private void uxContactEmailAddressesGrd_CellLeave(object sender, DataGridViewCellEventArgs e)
{
uxContactEmailAddressesGrd.AllowUserToAddRows = false;
}
也许有一天,别人会遇到这个问题,找到比我更优雅的解决方案。那简直太好了。确保将解决方案发布到此站点供其他人使用。