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);
}