数据新增窗体,有一个字段用到了ComboBox(cboFileDate)控件,此字段为必填,验证用到了Validating事件和ErrorProvider(epErrInfo)控件。
考虑到如果用户不进入ComboBox焦点,直接点击保存按钮,也需要对ComboBox进行验证。实现代码如下:
private void cboPhaseID_Validating(object sender, CancelEventArgs e) { if (this.cboPhaseID.SelectedIndex == -1) { e.Cancel = true; this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!"); } else { this.epErrInfo.SetError(this.cboPhaseID, ""); } }
private void btnSave_Click(object sender, EventArgs e) { List<Control> list = new List<Control>(); //需要验证的控件集合 list.Add(cboPhaseID); //...... foreach (var item in list) { item.Focus(); if (!this.Validate()) { return; } } //TO DO 保存数据到数据库 }
出现的异常:用户不进入ComboBox焦点,直接点击保存按钮后。点击cboFileDate,下拉项可以正常下拉,鼠标释放后,下拉项会自动收起,导致不能对cboFileDate绑定的值进行选取。
另外发现,此异常下在cboFileDate控件上按住鼠标左键拖拽可以选取... private void cboPhaseID_Validating(object sender, CancelEventArgs e) CS方式没必要用到这种方法
直接在你的按下的按钮事件中加入 就可以了
if (this.cboPhaseID.SelectedIndex == -1) { this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!"); } else { this.epErrInfo.SetError(this.cboPhaseID, ""); } 最终的解决方案如下: 所有验证还是写到控件的Validating事件中 去掉了e.Cancel = true;【需要的控件比较多时,考虑后期进一步对Validating事件进行封装,以批量注册Validating事件,传入验证类型,调用通用验证类,窗口关闭时销毁所有Validating事件】
|