2016-02-25 78 views
1

我有一个包含多个列的DataGridView,包括按钮和组合框。我想实现一个验证,当DataGridView失去焦点时触发,并按预期工作。但是,从DataGridView中的Text列移动到非Text(按钮,组合框)列时,也会触发相同的验证。LostFocus事件处理程序在点击选定行内的控件时触发

有没有人有任何建议如何解决这个问题?我尝试了各种可能的解决方案,但一直未能完全解决问题。

这里是我的事件处理程序和事件处理程序初始化样子代码:

初始化程序:

dgvCopy.LostFocus += dgvCopy_LostFocus; 

事件处理程序:

private void dgvCopy_LostFocus(object sender, EventArgs e) { 
    if (dgvCopy.SelectedRows.Count > 0) { 
     if (dgvCopy.SelectedRows[0].Cells["Type"].Value == null) { 
      MessageBox.Show("Please choose a type"); 
      txtCopyText.Enabled = false; 
     } 
    else { 
     txtCopyText.Enabled = true; 
    } 
} 

任何帮助或建议是多少不胜感激!

回答

1

您可以使用Validating事件而不是LostFocus
LostFocus也会在单元格的编辑控件显示时触发,但Validating仅在DataGridView未处于活动状态时不会再触发控件,或者您在Form上调用ValidateChildren时触发。

void dataGridView1_Validating(object sender, CancelEventArgs e) 
{ 
    //Perform Validation Here 
} 

注重,当你离开DataGridViewValidating火灾只有当新主动控制的CausesValidation属性设置为true。
因此,根据您的要求,您可能希望使用Leave事件。

+1

谢谢!这工作完美! –

+0

请注意,当您离开DataGridView时,仅当新活动控件的CausesValidation属性设置为true时,才会触发验证。 因此,根据您的要求,您可能希望使用Leave事件。 –

1

当你窝您的控件,您应该设置在每个嵌套控制假CausesValidation属性,然后使用Validating事件在LostFocus事件来验证数据,那么Validated事件继续成功流。如果您希望焦点更改触发非验证事件,并且您希望它通过嵌套层次结构进行更新,则应考虑使用Leave而不是LostFocus,因为LostFocus非常接近金属并且使句柄包含控件。

相关问题