从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);
        }
    }
}

从DataGridView中的自定义编辑控件引发CellValueChanged

这里的目标是什么?您似乎正在尝试创建一个键盘掩码,其中任何未确认的字符都会引发警报?如果是这样,您可以通过添加MaskedTextBoxColumn在DataGridView中找到快乐。MaskedTextBoxColumn以比强制编辑提交更合理的方式控制输入。

有关如何使用它的代码,请参阅此处:http://msdn.microsoft.com/en-us/library/ms180996.aspx

根据您在评论中更新的标准,听起来您的解决方案可能与预期一样好。然而,要意识到,当其他控件基于键盘事件在另一个控件上更新时,很容易进入无限的事件循环。表单上最好有一个处理所有事件的委托,因为它可以根据状态丢弃虚假事件,从而防止事件触发器的无限循环。

实际上,这将使用模型-视图-演示者模式,在该模式中,您的代理充当演示者并管理视图(UI)上的流量。

这样,您甚至可以将Presenter逻辑移动到一个新的类中,然后将其数据绑定到该类中,从而允许您从一个逻辑结构中完成对UI的控制,而不是从事件处理程序的大杂烩中完成。