2015-09-25 118 views
1

我正在使用DataGridView并有几个DataGridViewCheckBoxColumns设置,其中两个将ThreeState属性设置为True。有没有办法阻止DataGridViewCheckBoxColumn自动检查点击?

对于我网格中的一些行,我只希望复选框是Checked或Indeterminate。未经检查的应该永远不可用于用户。但是,如果用户重复点击复选框,它将从检查到不确定状态变为未选中状态。我只想让它去检查,不确定,检查,不确定等。

有没有办法打开停止复选框被点击时被选中/取消选中(类似于标准Windows窗体复选框控件上的AutoCheck属性),或者是否有一个事件可以用来取消DataGridViewCheckBoxCell的选中更改?

我试图以编程方式强制检查的单元格从未选中检查或不确定,但用户界面从未反映过这一点。

回答

1

假设任何DataGridViewCheckBoxColumn您添加沿袭的模式:

DataGridViewCheckBoxColumn cbc = new DataGridViewCheckBoxColumn(); 
cbc.ThreeState = true; 
this.dataGridView1.Columns.Add(cbc); 

然后,所有你需要做的是下面的事件处理程序添加到您的DataGridView的单击和双击复选框:

this.dataGridView1.CellContentClick += ThreeState_CheckBoxClick; 
this.dataGridView1.CellContentDoubleClick += ThreeState_CheckBoxClick; 

private void ThreeState_CheckBoxClick(object sender, DataGridViewCellEventArgs e) 
{ 
    DataGridViewCheckBoxColumn col = this.dataGridView1.Columns[e.ColumnIndex] as DataGridViewCheckBoxColumn; 

    if (col != null && col.ThreeState) 
    { 
     CheckState state = (CheckState)this.dataGridView1[e.ColumnIndex, e.RowIndex].EditedFormattedValue; 

     if (state == CheckState.Unchecked) 
     { 
      this.dataGridView1[e.ColumnIndex, e.RowIndex].Value = CheckState.Checked; 
      this.dataGridView1.RefreshEdit(); 
      this.dataGridView1.NotifyCurrentCellDirty(true); 
     } 
    } 
} 

本质上,切换顺序默认为:Checked => Indeterminate => Unchecked => Checked。因此,当点击事件触发Uncheck值时,您将其设置为Checked,并强制网格用新值刷新。

+1

非常感谢你,这个伎俩。我在正确的道路上,但没有最后两行来刷新和通知。谢谢 :) – AndyG

相关问题