我想在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;
}
}
此代码导致
所以我想要的是这样的
某些行或列应大于“单元格大小为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在绘画时不会做任何事情。