|  
 
 
数据新增窗体,有一个字段用到了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事件】 
 |