繁体   English   中英

为什么 DataGridView.CellValueChanged 在用户点击时重复触发<enter> ?</enter>

[英]Why is DataGridView.CellValueChanged repeatedly triggered when user hits <Enter>?

我正在使用 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 ”。

我究竟做错了什么?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM