winforms 为什么DataGridView.CellValueChanged会在用户点击时重复触发< Enter>?

enxuqcxy  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(257)

我使用DataGridView显示数据,其中一列是可编辑的-用户可以双击并编辑文本;当用户点击<Enter>时,CellValueChanged事件被触发。

private void dgvCompanyNameAliases_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    var row = dgvCompanyNameAliases.Rows[e.RowIndex];
    var companyNameMapping = (CompanyNameMapping)(row.Tag ?? row.DataBoundItem);
    companyNameMapping.Alias = dgvCompanyNameAliases.CurrentCell.EditedFormattedValue.ToString();

    if (String.IsNullOrWhiteSpace(companyNameMapping.Alias))
    {
        if (MessageBox.Show(String.Format(Resources.FrmSettings.ErrorQuestion_DeleteCompanyAliasConfirmMessage, companyNameMapping.Name),
                            Resources.FrmSettings.ErrorQuestion_DeleteCompanyAliasConfirmTitle,
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Question)
            == DialogResult.No)
        {
            return;
        }

        _configSettings.Policies.ProjectNamingPolicies.CompanyNameMappings.DeleteAlias(companyNameMapping, _configSettings.Username);
    }
    else
    {
        companyNameMapping.Recorded = new Recorded
                                      {
                                          By = _configSettings.Username,
                                          On = DateTime.Now
                                      };

        _configSettings.Policies.ProjectNamingPolicies.CompanyNameMappings.UpdateAlias(companyNameMapping);
    }

    LoadCompanyNameAliases();
}

private void LoadCompanyNameAliases()
{   
    dgvCompanyNameAliases.DataSource = _configSettings.Policies.ProjectNamingPolicies.CompanyNameMappings.GetAllAliases()
                                                      .OrderBy(companyNameMapping => companyNameMapping.Name)
                                                      .ToList();
}

但是,尽管这样做有效,事件处理程序仍会被重复触发,直到用户在问题对话框中选择No
我做错了什么?

qjp7pelc

qjp7pelc1#

试试这个。把它放在方法的第一行。如果isInEditMode为true,代码就可以工作。

if (e.ColumnIndex < 0 || e.RowIndex < 0 || !grid[e.ColumnIndex, e.RowIndex].IsInEditMode) return;
hwazgwia

hwazgwia2#

我通过将所有逻辑 * 从 * CellValueChanged事件处理程序 * 移到 * CellEndEdit来解决这个问题。

相关问题