如何在C#中获取datagridview的单元格状态

本文关键字:datagridview 单元格 状态 获取 | 更新日期: 2023-09-27 18:24:16

我有一个数据网格视图,dgv1,有10列C#形式的列,它以DB表为界。第二列是一个包含值的组合框,close/open/供考虑。。。。用户可以修改任何单元格中的值。修改完成后,用户可以按"保存"按钮将更改保存到DB表中。但在保存更改之前,还需要完成另一项任务:如果第二列的值发生了更改,则必须调用DB存储过程。

我的问题是,我不知道如何找出单元格的值是否发生了变化,而且我需要知道以前的值,以前的&当前值必须传递给存储过程。

foreach (DataRow rows in dtList.Rows)
{
   if(rows.RowState.ToString() == "Modified")
   {
      if(rows.cell(1) is changed)
      { 
         call stored procedure here... 
      }
    }
    i++;
}

如何在C#中获取datagridview的单元格状态

一个简单的方法(但可能不是最好的方法!)是使用List来存储ComboBox值。在表单加载时,我们可以写:

const int yourCell = 1;
List<string> colComboValues = new List<string>();
foreach (DataGridViewRow dgvRow in this.dataGridView.Rows)
{
    DataGridViewComboBoxCell CB = dgvRow.Cells[yourCell] as DataGridViewComboBoxCell;
    colComboValues.Add(CB.Value.ToString());
}

然后在保存时,我们可以使用检查哪些ComboBox发生了更改

// On Save.
int nIdx = 0;
foreach (DataGridViewRow dgvRow in this.dataGridView.Rows)
{
    DataGridViewComboBoxCell CB = dgvRow.Cells[yourCell] as DataGridViewComboBoxCell;
    if (String.Compare(CB.Value.ToString(), colComboValues[nIdx++], false) != 0)
    {
        // Value has changed!
    }
    else
    {
        // Value has not.
    }
}

希望这能有所帮助。

如果您订阅了CellBeginEdit和CellEndEdit事件,并在发生更改时将结果添加到字典中,那么最终结果将是您只需在编辑之前迭代字典,该字典将包含单元格作为其键,并包含上一个值(在我的例子中,对象是组合框值)。

    Dictionary<DataGridViewCell, object> cvDict = new Dictionary<DataGridViewCell, object>();
    private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        DataGridViewCell dgcv = (sender as DataGridView).Rows[e.RowIndex].Cells[e.ColumnIndex];
        if (!cvDict.ContainsKey(dgcv))
        {
            cvDict.Add(dgcv, dgcv.Value);
        }
    }
    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        DataGridViewCell dgcv = (sender as DataGridView).Rows[e.RowIndex].Cells[e.ColumnIndex];
        if (cvDict.ContainsKey(dgcv))
        {
            if (cvDict[dgcv].Equals(dgcv.Value))
            {
                cvDict.Remove(dgcv);
            }
        }
    }