0

我有一个组合框(好吧,实际上有一个 ToolStripComboBox),我想要一个在某些条件下触发的可取消事件:

  • 失去焦点
  • 获得焦点
  • 从框中选择的项目
  • 按 Enter

所以一个“正常”的验证事件,但是当我执行以下操作时

this.speedSelector.Validating 
+= new System.ComponentModel.CancelEventHandler(this.speedSelector_Validating);

此事件仅在我尝试通过 [X] 关闭应用程序时触发。此外,当存在无效文本时,我无法离开应用程序,这可行,但如何在上述条件下触发该事件?

问候,

4

2 回答 2

1

您可能需要将初始值存储在某处(例如可能在控件的通用标签字段中)。

您可以验证任何事件的控件:SelectedIndexChanged、SelectionChanged、TextUpdate 等。

当控件获得或失去焦点时,控件中存储的值不应更改。

public Form1() {
  InitializeComponent();
  speedSelector.Tag = speedSelector.Text;
  speedSelector.SelectedIndexChanged += new System.EventHandler(this.speedSelector_Changed);
  speedSelector.SelectionChangeCommitted += new System.EventHandler(this.speedSelector_Changed);    
  speedSelector.TextUpdate += new System.EventHandler(this.speedSelector_Changed);
}

private void speedSelector_Changed(object sender, EventArgs e) {
  if (validData(speedSelector.Text)) {
    speedSelector.Tag = speedSelector.Text;
  } else {
    speedSelector.Text = speedSelector.Tag.ToString();
  }
}

private static bool validData(string value) {
  bool result = false;
    // do your test here
  return result;
}
于 2012-07-25T19:06:52.477 回答
0

当将焦点从对话框上的 CausesValidation 属性设置为 true 的控件移动到另一个 CausesValidation 属性设置为 true 的控件时,将调用验证,例如从 TextBox 控件到 OK 按钮。也许您的验证发生在您关闭窗口时,因为您在窗口上设置了 CausesValidation,而不是在适当的控件上?

您也可以将所有验证移到控件的 OnBlur 事件中,然后这样做。

于 2012-07-25T19:06:38.727 回答