我有一个DataGridView(WinForms),我在其中定义了一个从DataGridViewTextBoxEditingControl派生的自定义EditingControl,它只允许使用数字字符。
每次用户按一个键时,我都需要在DataGridView上引发CellValueChanged事件,但默认行为是仅在编辑完成时才引发事件。
每次按下某个键时如何引发事件?
public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
e.Handled = Char.IsLetter(e.KeyChar);
if (!e.Handled)
RaiseDataGridViewCellValueChanged(); // <-- Any way?
}
}
更新
我找到了解决方法,但我不确定这是一个很好的解决方案:
public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
e.Handled = Char.IsLetter(e.KeyChar);
if (!e.Handled)
{
EditingControlDataGridView.EndEdit();
EditingControlDataGridView.BeginEdit(false);
}
}
}
答案 0 :(得分:1)
这里的目标是什么?您似乎正在尝试创建键盘蒙版,其中任何非确认角色都会发出警报?如果是这样,您可以通过添加MaskedTextBoxColumn在DataGridView中找到快乐。 MaskedTextBoxColumn以比强制编辑提交更合理的方式控制输入。
请参阅此处了解如何使用它的代码:http://msdn.microsoft.com/en-us/library/ms180996.aspx
根据您在评论中更新的标准,听起来您的解决方案可能会达到最佳效果。但是,要意识到当基于键盘事件在其他控件上更新其他控件时,非常很容易进入无限事件循环。您可能最好在表单上有一个处理所有事件的委托,因为它可以通过根据状态丢弃虚假事件来阻止事件触发器的无限循环。
实际上,这将使用模型视图展示器模式,您的代理人充当演示者并管理您的视图(您的UI)上的流量。
执行此操作,您甚至可以将Presenter逻辑移动到一个新的类中,然后将数据绑定到该类,从而允许您从一个逻辑构造完全控制UI,而不是大量的事件处理程序。