DataGridView列标题包含文本和复选框

时间:2014-09-15 16:56:18

标签: c# .net checkbox datagridview columnheader

我有两列复选框用于' Build'和'发布'。我希望每个标题都能显示' Build []"和'发布[]",其中[]是一个复选框,允许用户选择或取消选中相应列中的所有复选框。 优先级:如何在不创建新类或添加图像的情况下实现此目的? 最后的度假村:如果无法做到这一点,您能指导我构建合适的课程吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用两个常规CheckBoxes并将其添加到DataGridView

cbx_Build.Parent = dataGridView1;
cbx_Build.Location = new Point(0, 3);
cbx_Build.BackColor = SystemColors.Window;
cbx_Build.AutoSize = false;

cbx_Publish.Parent = dataGridView1;
cbx_Publish.Location = new Point(0, 3);
cbx_Publish.BackColor = SystemColors.Window;    
cbx_Publish.AutoSize = false;

要将它们放在ColumnHeaders中,请使用以下代码:

dataGridView1.CellPainting += dataGridView1_CellPainting;  


void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
  if (e.ColumnIndex == BuildIndex && e.RowIndex == 0) cbx_Build.Left = e.CellBounds.Left;
  if (e.ColumnIndex == PubIndex && e.RowIndex == 0) cbx_Publish.Left = e.CellBounds.Left;
}

如果需要,使用适当的索引来满足您的列和偏移量,以便将它们放在右侧。

您必须像往常一样实施逻辑以防止DGV中的值更改,例如在Validating事件..

更新:

这个事件可能是一个好的甚至更好的选择,因为它不经常被调用;它会这样做,至少如果您只需要在用户更改列宽后调整位置:

private void dataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
   cbx_Build.Left = dataGridView1.Columns[BuildIndex].HeaderCell.ContentBounds.Left;
   cbx_Publish.Left = dataGridView1.Columns[PubIndex].HeaderCell.ContentBounds.Left;
}

如果还可以删除,添加或重新排序列,则还必须编写这些事件的脚本:ColumnRemoved, ColumnAdded, ColumnDisplayIndexChanged。所有这些都与以上两行有关。