当前细胞脏状态改变火灾两次



我有一个数据网格视图,其中一行是组合框,我在该数据网格视图("注释"(中有一列,每当我更改标题时,我都会更新该列,即每当我更改组合框中的值时,字段"注释"都会由该行和列的值填充。

我使用事件 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);
}

最新更新