【问题标题】:ASP.NET GridView sorting on a calculated fieldASP.NET GridView 对计算字段进行排序
【发布时间】:2008-12-24 13:52:11
【问题描述】:

我有一个 DataBound GridView。但是,我有一列的值来自后面代码中的计算 - 它显示在 TemplateField 中。

如何根据这个计算值对我的网格进行排序?

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    将您最初返回的数据放入 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; 
    

    【讨论】:

    • 还有另一种方法可以做到这一点。您可以按照@Stephen 的正确建议将列添加到DataTable,但是,如果您需要使用DataTable 的其他列将新列计算为表达式,则无需遍历所有行。您可以简单地使用DataTable dt = GetDataTableFromDataBaseMethod();,然后作为示例使用dt.Columns.Add("CalculatedColumnName", typeof(double), "(FirstValueColumn - SecondValueColumn) * ThirdValueColumn");。如果您无法将表达式直接添加到查询中,这可能非常有用,无论如何这始终是最佳选择。
    【解决方案2】:

    一种可能的解决方案是填充数据表而不是绑定网格。然后使用将排序设置为计算列的数据视图,并将其绑定到后面代码中的网格。

    【讨论】:

      【解决方案3】:

      另一个解决方案是考虑将计算列添加到数据库表本身。这样做的好处是在加载行的其余部分的同一 SQL 表达式中返回计算的列,但不幸的是确实需要更改数据库架构。

      【讨论】:

      • 是的,我在值得保留数据的地方执行此操作 - 但这是在特定位置,我不想更改架构
      【解决方案4】:

      请注意,向数据表添加一列会将所有行标记为已更新,因此在保存回数据库时,它将尝试更新所有记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 2018-09-22
        • 2015-03-24
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        相关资源
        最近更新 更多