[英]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.