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

本文关键字:AND 复选框 文本 包含 标题 DataGridView | 更新日期: 2023-09-27 18:21:53

我有两列用于"Build"answers"Publish"的复选框。我希望每个标题都显示"Build[]"answers"Publish[]",其中[]是一个复选框,允许用户选择或取消选择相应列中的所有复选框优先级:如何在不创建新类或添加图像的情况下实现这一点最后一个解决方案:如果这不可能,你能指导我构建合适的类吗?提前感谢!

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

您可以使用两个常规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。以上两条线均可使用。