CurrentCellDirtyStateChanged 触发两次
CurrentCellDirtyStateChanged fires twice
我有一个 datagridview,其中一行是组合框,我在该 datagridview ("Notes") 中有一个列,每当我更改 header 时我都会更新它,即每当我更改值时在组合框中,字段 "Notes" 由该行和列的值填充。
我使用事件 CurrentCellDirtyStateChanged 来捕捉它,但问题是事件被触发了两次,导致字段中连接的值重复 "Notes"。
我该如何解决。
我的代码示例:
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;
}
双发的原因是cell dirty state先ON后OFF,都会导致cell state发生变化
解决方案如下:添加 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);
}
我有一个 datagridview,其中一行是组合框,我在该 datagridview ("Notes") 中有一个列,每当我更改 header 时我都会更新它,即每当我更改值时在组合框中,字段 "Notes" 由该行和列的值填充。
我使用事件 CurrentCellDirtyStateChanged 来捕捉它,但问题是事件被触发了两次,导致字段中连接的值重复 "Notes"。
我该如何解决。
我的代码示例:
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;
}
双发的原因是cell dirty state先ON后OFF,都会导致cell state发生变化
解决方案如下:添加 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);
}