如何在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++;
}
一个简单的方法(但可能不是最好的方法!)是使用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);
}
}
}