2012-08-09 48 views
2

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

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

但它不工作,我已经看到,在e.RowIndex事件CellValidating不对应上,我刚才单击但e.ColumnIndex是正确的行索引...

综上所述,我想的是,当用户选中某一行的复选框列时,如果其他两列的值都设置为0对于同一行,我希望保持复选框列不变(它保持原有值,例如,如果它未被选中,用户检查它,它将保持未选中状态)。否则,如果这两列不都设置为0,则复选框列会将其考虑在内,例如,如果它未被选中并且用户检查它,它将改变为检查。

任何想法?

+0

请发布您处理'CellValidating'事件的代码。 – 2012-08-09 20:18:33

回答

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被调用你以前的任何细胞,这就是为什么行索引没有意义。

+1

+1 100%同意解决方案和关于“CellValidating”事件的重要评论。从[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvalidating.aspx)我们读到:_Occurs当一个单元**失去**输入焦点_ ... – 2012-08-10 00:30:07

+0

非常感谢,太棒了。 – user304602 2012-08-10 07:48:16