【发布时间】:2008-12-24 13:52:11
【问题描述】:
我有一个 DataBound GridView。但是,我有一列的值来自后面代码中的计算 - 它显示在 TemplateField 中。
如何根据这个计算值对我的网格进行排序?
【问题讨论】:
我有一个 DataBound GridView。但是,我有一列的值来自后面代码中的计算 - 它显示在 TemplateField 中。
如何根据这个计算值对我的网格进行排序?
【问题讨论】:
将您最初返回的数据放入 DATASET 或 DATATABLE。为您的计算字段添加一个新列到 DATATABLE。走该数据进行必要的计算,并将结果放入所述计算字段。
根据数据表创建新视图,并按计算字段对视图进行排序。将网格绑定到数据视图。
Dim DT as DataTable
DT = GetDataTableFromDataBaseMethod()
DT.Columns.Add(New DataColumn("CalculatedColumnName"))
For each row as DataRow in DT.Rows
row("CalculatedColumnName") = PerformCalculations(row)
Next
Dim view as New DataView
view.DataTable =dt
View.Sort = "CalculatedColumnName DESC"
datagrid1.Datasource = view
datagrid1.Databind
或者,如果可能,在 SQL 语句中执行计算,re:
SELECT Col1, Col2, Col3, Col1+Col2+Col3 AS LineTotal FROM Table;
【讨论】:
DataTable,但是,如果您需要使用DataTable 的其他列将新列计算为表达式,则无需遍历所有行。您可以简单地使用DataTable dt = GetDataTableFromDataBaseMethod();,然后作为示例使用dt.Columns.Add("CalculatedColumnName", typeof(double), "(FirstValueColumn - SecondValueColumn) * ThirdValueColumn");。如果您无法将表达式直接添加到查询中,这可能非常有用,无论如何这始终是最佳选择。
一种可能的解决方案是填充数据表而不是绑定网格。然后使用将排序设置为计算列的数据视图,并将其绑定到后面代码中的网格。
【讨论】:
另一个解决方案是考虑将计算列添加到数据库表本身。这样做的好处是在加载行的其余部分的同一 SQL 表达式中返回计算的列,但不幸的是确实需要更改数据库架构。
【讨论】:
请注意,向数据表添加一列会将所有行标记为已更新,因此在保存回数据库时,它将尝试更新所有记录。
【讨论】: