动态创建GridView时设置列宽的问题求助
解决动态GridView设置列宽的问题
嘿,作为新手遇到这个问题太正常了——当开启AutoGenerateColumns="true"时,直接修改DataTable列的设置往往不会生效,因为GridView会自动生成列并覆盖这些配置。我给你几个实用的解决方案,你可以根据自己的需求选:
方法一:利用RowDataBound事件设置列宽
这是最适合自动生成列场景的办法,我们可以在GridView绑定数据的过程中,给每一行的单元格设置宽度:
' 先给动态创建的GridView绑定RowDataBound事件 AddHandler mygrid.RowDataBound, AddressOf GridView_RowDataBound ' 然后编写事件处理方法 Private Sub GridView_RowDataBound(sender As Object, e As GridViewRowEventArgs) ' 给表头和数据行的单元格都设置宽度 If e.Row.RowType = DataControlRowType.Header Or e.Row.RowType = DataControlRowType.DataRow Then ' 第一列设为150px e.Row.Cells(0).Width = Unit.Pixel(150) ' 第二列设为200px,按需添加其他列 e.Row.Cells(1).Width = Unit.Pixel(200) End If End Sub
这样不管是表头还是数据行,对应列的宽度都会统一生效,而且不需要关闭自动生成列的功能。
方法二:手动创建列(更可控)
如果你的列结构是固定的,关闭AutoGenerateColumns手动创建BoundField会让你对列的控制更精准,包括宽度、表头文字、样式等:
mygrid.AutoGenerateColumns = False ' 先关闭自动生成 ' 手动添加第一列 Dim firstCol As New BoundField() firstCol.DataField = dt.Columns(0).ColumnName ' 对应DataTable的列名 firstCol.HeaderText = "你的第一列标题" firstCol.ItemStyle.Width = Unit.Pixel(150) ' 设置单元格宽度 firstCol.HeaderStyle.Width = Unit.Pixel(150) ' 同步表头宽度 mygrid.Columns.Add(firstCol) ' 同理添加其他列... Dim secondCol As New BoundField() secondCol.DataField = dt.Columns(1).ColumnName secondCol.HeaderText = "第二列标题" secondCol.ItemStyle.Width = Unit.Pixel(200) mygrid.Columns.Add(secondCol)
这种方式虽然多写几行代码,但能避免自动生成列带来的不确定性,适合需要定制列样式的场景。
方法三:用CSS统一控制列宽
你已经给表头加了CSS类,也可以用CSS来批量控制列宽,这种方式不需要修改后台代码,维护起来更方便:
首先给GridView的单元格样式添加CSS类:
mygrid.ItemStyle.CssClass = "grid-table-cell"
然后在页面的样式表中添加:
/* 控制第一列宽度 */ .grid-table-cell td:nth-child(1) { width: 150px; } /* 控制第二列宽度 */ .grid-table-cell td:nth-child(2) { width: 200px; }
如果需要给表头单独设置样式,也可以用你已有的single_header类来调整:
.single_header th:nth-child(1) { width: 150px; }
小提示
- 你已经设置了
mygrid.Width = "700",记得各列宽度总和不要超过这个值,否则GridView会自动调整列宽; - 如果列内容过长导致宽度被撑开,可以设置
ItemStyle.Wrap = True让文字换行,保持列宽稳定。
内容的提问来源于stack exchange,提问作者Aiman Musa
相关产品推荐
相关产品推荐

