单击所选行中的控件时,将触发LostFocus事件处理程序

时间:2016-02-25 19:25:51

标签: c# winforms datagridview

我有一个包含多个列的DataGridView,包括按钮和组合框。我正在尝试实现一个验证,当DataGridView失去焦点并且这按预期工作时触发。但是,当从DataGridView中的Text列移动到非Text(按钮,组合框)列时,也会触发相同的验证。

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

以下是我的事件处理程序和事件处理程序初始化程序的代码:

初​​始化器:

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;
    }
}

非常感谢任何帮助或建议!

2 个答案:

答案 0 :(得分:1)

您可以使用Validating事件代替LostFocus 当单元格的编辑控件显示时,LostFocus也会触发,Validating仅在DataGridView不再对表单进行活动控制时或在ValidateChildren上调用Form时触发{1}}。

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

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

答案 1 :(得分:1)

嵌套控件时,应将每个嵌套控件上的CausesValidation属性设置为false,然后使用Validating事件覆盖LostFocus事件来验证数据,然后{ {1}}事件继续成功。如果您希望焦点更改触发非验证事件,并且您希望它通过嵌套层次结构进行更新,则应考虑使用Validated而不是Leave,因为LostFocus非常接近金属并且句柄包含控件。