2008-10-21 67 views
4

我有一个DataGridView(WinForms),其中我定义了一个自DataGridViewTextBoxEditingControl派生的自定义EditingControl,它只允许数字字符。从DataGridView中的自定义编辑控件引发CellValueChanged

每次用户按下某个键时,我需要在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); 
     } 
    } 
} 

回答

1

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

看到这里的代码演示如何使用它:http://msdn.microsoft.com/en-us/library/ms180996.aspx

根据意见更新的标准,这听起来像您的解决方案可能是一样好,因为它会得到。然而,意识到它是当你有其他控件基于键盘事件更新另一个控件时,很容易进入无限事件循环。您可能最擅长在处理所有事件的表单上拥有一个委托,因为它可以通过根据状态丢弃虚假事件来防止事件触发器的无限循环。

实际上,这将使用模型视图展示器模式,您的委托人充当演示者并管理视图(您的UI)上的流量。

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

+0

我试图检测单元格文本发生变化时没有等待焦点离开单元格。 – Juanma 2008-10-26 10:11:52

相关问题