VB.NET Windows Form中支持单格多数据加配图功能的控件如何选择
VB.NET实现多条目带图单元格的可行方案
原生控件可通过自定义扩展实现需求,无需完全替换DataGridView,以下是优先级从高到低的实现方案:
方案1:自定义DataGridView单元格(推荐)
改动最小、和现有DataGridView逻辑兼容最好的方案,实现步骤如下:
- 继承
DataGridViewImageCell或者直接重写所属列的CellPainting事件 - 绘制逻辑逐行处理每个学生条目:每一行先绘制手机号图标,再绘制对应学生名称,按预设行高依次向下排列
- 参考代码:
Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting ' 只处理目标列、非表头行 If e.ColumnIndex = 目标列索引 AndAlso e.RowIndex >= 0 Then e.Handled = True e.PaintBackground(e.CellBounds, True) Dim students As List(Of Student) = CType(e.Value, List(Of Student)) Dim drawPoint As Point = New Point(e.CellBounds.X + 2, e.CellBounds.Y + 2) Dim iconHeight As Integer = 16 ' 手机号图标预设高度 For Each stu In students ' 绘制手机号图标 e.Graphics.DrawImage(My.Resources.手机号图标, New Rectangle(drawPoint, New Size(16, 16))) ' 绘制学生名称 e.Graphics.DrawString(stu.Name, e.CellStyle.Font, Brushes.Black, drawPoint.X + 20, drawPoint.Y) ' 下移绘制坐标 drawPoint.Y += iconHeight + 4 Next e.PaintContent(e.CellBounds) End If End Sub
- 补充配置:将该列的
AutoSizeMode设为AllCells,重写CellFormatting事件动态计算单元格高度即可适配内容长度。
方案2:嵌套TableLayoutPanel
如果不需要复用DataGridView的排序、分页等原生能力,可直接用TableLayoutPanel做容器:
- 外层TableLayoutPanel按行列布局你的表格结构
- 对应需要多内容的单元格插入内层TableLayoutPanel,每行放一个PictureBox(放置手机号图标)+一个Label(放置学生名称)即可
- 优势是布局完全可视化无需自定义绘制,劣势是数据量大时性能远低于DataGridView。
方案3:第三方控件(可选)
如果项目允许引入第三方控件,DevExpress GridControl、ComponentOne FlexGrid都原生支持单元格内多内容模板,直接配置模板即可实现需求,无需额外编码。

内容的提问来源于stack exchange,提问作者Wael
相关产品推荐
相关产品推荐

