在WinForms网格中创建多列或多行

时间:2017-09-07 10:07:26

标签: c# winforms gridview

我想在WinForms中创建一个gridView,它能够获取包含子列的列。行元素应该能够填充多行。

这是一个示例代码

    public partial class Frm : Form
{
    public Frm()
    {
        InitializeComponent();
        gridView.DataSource = FillTable(); // set the table
    }

    private DataTable FillTable() // set some example data
    {
        DataTable tbl = new DataTable();

        tbl.Columns.Add("Col 1", typeof(int));
        tbl.Columns.Add("Col 2", typeof(string));
        tbl.Columns.Add("Col 3", typeof(bool));

        tbl.Rows.Add(1, "Val 1", true);
        tbl.Rows.Add(2, "Val 2", false);
        tbl.Rows.Add(3, "Val 3", true);
        tbl.Rows.Add(4, "Val 4", false);
        tbl.Rows.Add(5, "Val 5", true);

        return tbl;
    }
}

此代码导致

current gridView

所以我想要的是这样的

desired gridView

某些行或列应大于“单元格大小为1,1”。

是否可以通过代码获取此信息?在调整列或类似内容时,绘制网格不是最佳解决方案。

1 个答案:

答案 0 :(得分:2)

我认为最简单的解决方案是创建两个DataGridViewRowHeaderCell的子类。

NoPaintHeaderCell是一个DataGridViewHeaderCell,与任何其他DataGridViewHeaderCell一样,但不会绘制任何内容。

MultiColumnHeaderCell是一个DataGridViewHeaderCell,用于绘制从单元格位置开始的所有标题,包括位于MultiColumnHeaderCell右侧的所有NoPaintHeaderCell

在您的示例中,第2列将获得MultiColumnHeaderCell,第3列将获得NoPaintHeaderCell。当需要绘制第2列的MultiColumnHeaderCell时,它会检测右侧的哪种标题单元格。然后它决定将所有细胞描绘成一个大细胞。

因此MultiColumnHeaderCell会覆盖DataGridViewHeaderCell.Paint

protected override void Paint(Graphics graphics,
    Rectangle clipBounds,
    Rectangle cellBounds, 
    int rowIndex,
    DataGridViewElementStates dataGridViewElementState, 
    object value, 
    object formattedValue,
    string errorText, 
    DataGridViewCellStyle cellStyle,
    DataGridViewAdvancedBorderStyle advancedBorderStyle,
    DataGridViewPaintParts paintParts)
{
     // adjust clipbounds and cellbounds, such that it paints itself + 
     // the area of the NoPaintCells directly on the right.
     base.Paint(adjustedClipBounds, adjustedCellBounds, ...);
}

请参阅DataGridViewHeaderCell.Paint的源代码。您会看到一个代码段:

  if (DataGridViewCell.PaintBorder(paintParts))
  {
      PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
  } 

因为你调整了clipBounds和cellBounds,所以你不必覆盖DataGridViewCellHeader.PaintBorder

NoPaintHeaderCell在绘画时不会做任何事情。