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

本文关键字:LostFocus 程序 事件处理 控件 单击 | 更新日期: 2023-09-27 18:36:11

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

有人对如何解决这个问题有任何建议吗?我已经尝试了各种可能的解决方案,但无法完全解决问题。

下面是我的事件处理程序和事件处理程序初始值设定项的代码:

初始 化:

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

任何帮助或建议将不胜感激!

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

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

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

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

嵌套

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