我有一个数据网格视图,其中一行是组合框,我在该数据网格视图("注释"(中有一列,每当我更改标题时,我都会更新该列,即每当我更改组合框中的值时,字段"注释"都会由该行和列的值填充。
我使用事件 CurrentCellDirtyStateChanged 来捕获它,但问题是该事件触发了两次,导致"注释"字段中连接的值重复。
我该如何解决这个问题。
我的代码示例:
private void dataGridViewReader_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
string columnName = dataGridViewReader.CurrentCell.OwningColumn.Name;
dataGridViewReader.CommitEdit(DataGridViewDataErrorContexts.Commit);
string columnName2 = dataGridViewReader.CurrentCell.Value.ToString();
if (columnName2 == "Notes")
{
for (int rows = 1; rows < dataGridViewReader.Rows.Count; rows++)
{
if (!string.IsNullOrEmpty(dataGridViewReader.Rows[rows].Cells[dataGridViewReader.CurrentCell.ColumnIndex].Value.ToString()))
{
dataGridViewReader.Rows[rows].Cells[0].Value += dataGridViewReader.Rows[rows].Cells[dataGridViewReader.CurrentCell.ColumnIndex].Value + @"<br/>";
}
}
}
DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGridViewReader.Rows[0].Cells[dataGridViewReader.CurrentCell.ColumnIndex];
dgvcbc.Style.ForeColor = Color.DarkGreen;
}
双重触发的原因是单元格脏状态首先打开然后关闭,两者都会导致单元格状态的相应变化。
这是解决方案:添加CellValueChanged
事件处理程序,放置代码内容:
private void dataGridViewReader_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
string columnName = dataGridViewReader.CurrentCell.OwningColumn.Name;
string columnName2 = dataGridViewReader.CurrentCell.Value.ToString();
if (columnName2 == "Notes")
{
for (int rows = 1; rows < dataGridViewReader.Rows.Count; rows++)
{
if (!string.IsNullOrEmpty(dataGridViewReader.Rows[rows].Cells[dataGridViewReader.CurrentCell.ColumnIndex].Value.ToString()))
{
dataGridViewReader.Rows[rows].Cells[0].Value += dataGridViewReader.Rows[rows].Cells[dataGridViewReader.CurrentCell.ColumnIndex].Value + @"<br/>";
}
}
}
DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGridViewReader.Rows[0].Cells[dataGridViewReader.CurrentCell.ColumnIndex];
dgvcbc.Style.ForeColor = Color.DarkGreen;
}
当前CurrentCellDirtyStateChanged
处理程序通过以下简单代码进行更改:
private void dataGridViewReader_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridViewReader.IsCurrentCellDirty)
dataGridViewReader.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
这应该使您的基本代码运行一次:当用户使单元格变脏时(当嵌入式组合框更改其值时(。
找到了问题的解决方案:
替换string columnName2 = dataGridViewReader.CurrentCell.Value.ToString();
添加:dataGridViewReader.CommitEdit(DataGridViewDataErrorContexts.Commit);
在代码末尾
新代码:
private void dataGridViewReader_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
string columnName = dataGridViewReader.CurrentCell.OwningColumn.Name;
string columnName2 = dataGridViewReader.CurrentCell.EditedFormattedValue.ToString();
if (columnName2 == "Notes")
{
for (int rows = 1; rows < dataGridViewReader.Rows.Count; rows++)
{
if (!string.IsNullOrEmpty(dataGridViewReader.Rows[rows].Cells[dataGridViewReader.CurrentCell.ColumnIndex].Value.ToString()))
{
dataGridViewReader.Rows[rows].Cells[0].Value += dataGridViewReader.Rows[rows].Cells[dataGridViewReader.CurrentCell.ColumnIndex].Value + @"<br/>";
}
}
}
DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGridViewReader.Rows[0].Cells[dataGridViewReader.CurrentCell.ColumnIndex];
dgvcbc.Style.ForeColor = Color.DarkGreen;
dataGridViewReader.CommitEdit(DataGridViewDataErrorContexts.Commit);
}