从DataGridView中的自定义编辑控件引发CellValueChanged
本文关键字:控件 CellValueChanged 编辑 自定义 DataGridView | 更新日期: 2023-09-27 17:48:48
我有一个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);
}
}
}
这里的目标是什么?您似乎正在尝试创建一个键盘掩码,其中任何未确认的字符都会引发警报?如果是这样,您可以通过添加MaskedTextBoxColumn在DataGridView中找到快乐。MaskedTextBoxColumn以比强制编辑提交更合理的方式控制输入。
有关如何使用它的代码,请参阅此处:http://msdn.microsoft.com/en-us/library/ms180996.aspx
根据您在评论中更新的标准,听起来您的解决方案可能与预期一样好。然而,要意识到,当其他控件基于键盘事件在另一个控件上更新时,很容易进入无限的事件循环。表单上最好有一个处理所有事件的委托,因为它可以根据状态丢弃虚假事件,从而防止事件触发器的无限循环。
实际上,这将使用模型-视图-演示者模式,在该模式中,您的代理充当演示者并管理视图(UI)上的流量。
这样,您甚至可以将Presenter逻辑移动到一个新的类中,然后将其数据绑定到该类中,从而允许您从一个逻辑结构中完成对UI的控制,而不是从事件处理程序的大杂烩中完成。