验证DataGridView单元格

时间:2012-08-09 09:53:57

标签: .net datagridview

我有一个DataGridView,其中一个列是DataGridViewCheckBoxColumn。当我检查此列的单元格时,我验证同一行(但在不同列中)中的另外两个单元格是0。如果两者都是0,那么我想取消为复选框列输入的新值(使用该事件并忽略其上的更改)。那就是:如果你检查它,其他两列都是0(在同一行),那么我想取消选中复选框。

我通过处理CellValidating事件来做到这一点。在里面我检查这两个单元格(在同一行中)是否都是0,如果是这样,并且用户检查了复选框单元格(也在同一行),那么我做e.Cancel = true,以便保持取消选中复选框单元格并忽略用户完成的检查。

但它不起作用,我看到e.RowIndex事件中的CellValidating与我刚刚点击的行索引不对应,但e.ColumnIndex是正确的... < / p>

总之,我想要的是当用户检查行的复选框列时,如果同一行的其他两列值都设置为0,我希望保持复选框列不变(它保留其旧值,例如,如果未经检查并且用户检查它,它将保持未选中状态)。否则,如果这两列都未设置为0,则复选框列会将其考虑在内,例如,如果取消选中并且用户检查它,它将更改为已选中。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我会使用与CellValidating不同的事件。我会使用CellBeginEdit

dataGridView1.CellBeginEdit += CellBeginEdit;

private void CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;      
    if (dgv[0, e.RowIndex].Value == "2") # or whatever conditions you want to check
    {
        e.Cancel = true;
    }
    else
    {
        e.Cancel = false;
    }
}

我相信CellValidating会在之前的任何单元格上被调用,这就是为什么行索引没有意义。