2014-10-26 36 views
1

我做了一个窗体窗体应用程序,并且在我的网格视图的标题中有一个复选框。我想使主标题复选框检查所有其他复选框。如何使我的主复选框为所有其他复选框的默认选项

因此,如果我选中主复选框https://imageshack.com/i/ippzf3rGp,,则应该自动选中以下所有复选框。如果我取消选中主标题复选框,那么所有下面的复选框应该取消选中。我怎样才能做到这一点我的代码如下:

public delegate void CheckBoxClickedHandler(bool state); 
public class DataGridViewCheckBoxHeaderCellEventArgs : EventArgs 
{ 
    bool _bChecked; 
    public DataGridViewCheckBoxHeaderCellEventArgs(bool bChecked) 
    { 
     _bChecked = bChecked; 
    } 
    public bool Checked 
    { 
     get { return _bChecked; } 
    } 
} 

class DatagridViewCheckBoxHeaderCell : DataGridViewColumnHeaderCell 
{ 
    Point checkBoxLocation; 
    Size checkBoxSize; 
    bool _checked = false; 
    Point _cellLocation = new Point(); 
    System.Windows.Forms.VisualStyles.CheckBoxState _cbState = 
     System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal; 
    public event CheckBoxClickedHandler OnCheckBoxClicked; 

    public DatagridViewCheckBoxHeaderCell() 
    { 

    } 

    protected override void Paint(System.Drawing.Graphics graphics, 
      System.Drawing.Rectangle clipBounds, 
      System.Drawing.Rectangle cellBounds, 
      int rowIndex, 
      DataGridViewElementStates dataGridViewElementState, 
      object value, 
      object formattedValue, 
      string errorText, 
      DataGridViewCellStyle cellStyle, 
      DataGridViewAdvancedBorderStyle advancedBorderStyle, 
      DataGridViewPaintParts paintParts) 
    { 
     base.Paint(graphics, clipBounds, cellBounds, rowIndex, 
       dataGridViewElementState, value, 
       formattedValue, errorText, cellStyle, 
       advancedBorderStyle, paintParts); 
     Point p = new Point(); 
     Size s = CheckBoxRenderer.GetGlyphSize(graphics, 
     System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal); 
     p.X = cellBounds.Location.X + 
       (cellBounds.Width/2) - (s.Width/2); 
     p.Y = cellBounds.Location.Y + 
       (cellBounds.Height/2) - (s.Height/2); 
     _cellLocation = cellBounds.Location; 
     checkBoxLocation = p; 
     checkBoxSize = s; 
     if (_checked) 
      _cbState = System.Windows.Forms.VisualStyles. 
        CheckBoxState.CheckedNormal; 
     else 
      _cbState = System.Windows.Forms.VisualStyles. 
        CheckBoxState.UncheckedNormal; 
      CheckBoxRenderer.DrawCheckBox 
        (graphics, checkBoxLocation, _cbState); 
     } 

    protected override void OnMouseClick(DataGridViewCellMouseEventArgs e) 
    { 
     Point p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y); 
     if (p.X >= checkBoxLocation.X && p.X <= 
       checkBoxLocation.X + checkBoxSize.Width 
       && p.Y >= checkBoxLocation.Y && p.Y <= 
       checkBoxLocation.Y + checkBoxSize.Height) 
     { 
      _checked = !_checked; 
      if (OnCheckBoxClicked != null) 
      { 
       OnCheckBoxClicked(_checked); 
       this.DataGridView.InvalidateCell(this); 
      } 

     } 
     base.OnMouseClick(e); 
    } 
} 
+1

斯泰西我想我已经给出了这个问题的答案。有一个事件可以用来编写应用网格单元格值来检查或取消选中状态的代码。将在标题复选框状态中调用的方法更改为“OnCheckBoxClicked”。在这里,您可以将所有网格单元格值应用于'_checked'参数值循环。顺便说一句,我会在1小时后给你答复。 – Shell 2014-10-28 02:14:29

+0

@Shell NO SHELL你没有给我!!!我肯定!关于那个 – 2014-10-28 12:42:45

回答

1

您需要电网分配数据源后处理上filter_table()方法OnCheckBoxClicked事件。

private void filter_table() 
{ 
    .... your code 
    dataGridView1.DataSource = dt; 
    cbHeader = (DatagridViewCheckBoxHeaderCell)dataGridView1.Columns[0].HeaderCell; 
    cbHeader.OnCheckBoxClicked += new CheckBoxClickedHandler(cbHeader_OnCheckBoxClicked); 
} 

,并在表单中添加下面的方法(也可以只filter_table()后添加此方法)

private void cbHeader_OnCheckBoxClicked(bool _checked) 
{ 
    for (int i = 0; i < dataGridView1.Rows.Count; i++) 
    { 
     //Give the check box column index instead of 0 in .Cells[0] 
     dataGridView1.Rows[i].Cells[0].Value = _checked; 
    } 
} 
相关问题