如何让WebGrid按传入的默认顺序(数据库列序)展示列?
解决WebGrid默认按字母排序列的问题,保持数据库原列顺序
你的问题很典型——WebGrid在自动生成列的时候,默认会对属性/列名按字母排序,这就导致没法保留你从数据库里拿到的原始列顺序。好在我们可以通过手动指定WebGrid的列集合来解决这个问题,而且因为你是循环处理不同结构的数据表,这个方法也能适配动态场景。
核心思路
WebGrid的columns参数允许我们自定义列的顺序、表头和绑定字段。我们可以直接从传入的DataTable(假设你的item是DataTable类型)中获取原始列顺序,然后生成对应的WebGridColumn列表,传给WebGrid即可。
修改后的视图代码
@{ foreach (var item in ViewBag.GenericTable) { // 确保item是DataTable类型,可根据实际数据源调整类型判断 var dataTable = item as DataTable; if (dataTable != null) { // 从DataTable中按数据库返回的原始顺序生成WebGrid列集合 var gridColumns = dataTable.Columns.Cast<DataColumn>() .Select(col => new WebGridColumn { ColumnName = col.ColumnName, Header = col.ColumnName, CanSort = false // 不需要排序可关闭,需要排序设为true即可 }).ToList(); var grid = new WebGrid(source: dataTable, columns: gridColumns); @grid.GetHtml( headerStyle: "table table-bordered", tableStyle: "table table-striped table-hover", alternatingRowStyle: "alt", selectedRowStyle: "table-inverse" ); } } }
代码说明
- 类型转换:先把循环中的
item转换成DataTable(从你的控制器代码来看,传入的应该是DataTable类型的集合)。 - 生成列集合:通过
dataTable.Columns.Cast<DataColumn>()获取数据库返回的原始列顺序,逐个创建WebGridColumn,绑定对应的列名和表头。 - 初始化WebGrid:创建WebGrid实例时,把自定义的
gridColumns传给columns参数,这样WebGrid就会按我们指定的顺序渲染列,而非默认的字母排序。
额外适配(如果数据源是实体类集合)
如果你的数据源不是DataTable,而是强类型实体类集合,可通过反射获取类的属性定义顺序(C#编译后会保留属性定义顺序)来生成列集合:
var properties = typeof(YourEntityType).GetProperties(BindingFlags.Public | BindingFlags.Instance); var gridColumns = properties.Select(prop => new WebGridColumn { ColumnName = prop.Name, Header = prop.Name }).ToList();
这样不管你循环多少张结构不同的表,都能自动保留原始的列顺序啦!
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

