【问题标题】:Sort a function in c# gridview在c#gridview中对函数进行排序
【发布时间】:2014-07-03 15:23:12
【问题描述】:

我正在构建一个小型 web 应用程序来跟踪赢/输/平均。数据被保存在一个 XML 文件中(因为它只有几行)。我想尝试让页面的访问者能够按可能的每一列(播放、获胜、平均)进行排序。我可以让它对 Played 和 Won 进行排序,但不是 Average,因为 Average 是一个计算值。

如何获得它对 GetWinAverage 函数的结果进行排序?

这是它目前的样子:

<asp:GridView ID="Results" runat="server" AutoGenerateColumns="false" AllowSorting="true" OnSorting="gvResults_Sorting" EnableViewState="true">
        <Columns>
            <asp:TemplateField HeaderText="Played" SortExpression="Played">
                <ItemTemplate>
                    <asp:Label ID="lblPlayed" runat="server" Text='<%# Eval("Played") %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <Columns>
            <asp:TemplateField HeaderText="Won" SortExpression="Won">
                <ItemTemplate>
                    <asp:Label ID="lblWon" runat="server" Text='<%# Eval("Won") %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <Columns>
            <asp:TemplateField HeaderText="Average" SortExpression="Average">
                <ItemTemplate>
                    <asp:Label ID="lblAverage" runat="server" Text='<%# GetWinAverage(Eval("Won"), Eval("Played")) %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>

GetWinAverage 如下所示:

public string GetWinAverage(object gamesWon, object gamesPlayed)
    {
        string strReturn = "";
        double iWon = Convert.ToDouble(gamesWon);
        double iPlayed = Convert.ToDouble(gamesPlayed);
        if (iPlayed < 0)
        {
            return "0%";
        }
        else
        {
            double dReturn = (iWon / iPlayed) * 100;
            strReturn = string.Format("{0:N2}%", dReturn);
            return strReturn;
        }
    }

排序看起来像这样:

private const string ASCENDING = " ASC";
    private const string DESCENDING = " DESC";

    public SortDirection GridViewSortDirection
    {
        get
        {
            if (ViewState["sortDirection"] == null)
                ViewState["sortDirection"] = SortDirection.Ascending;

            return (SortDirection)ViewState["sortDirection"];
        }
        set { ViewState["sortDirection"] = value; }
    }

    protected void gvResults_Sorting(object sender, GridViewSortEventArgs e)
    {
        string sortExpression = e.SortExpression;

        if (GridViewSortDirection == SortDirection.Ascending)
        {
            GridViewSortDirection = SortDirection.Descending;
            SortGridView(sortExpression, DESCENDING);
        }
        else
        {
            GridViewSortDirection = SortDirection.Ascending;
            SortGridView(sortExpression, ASCENDING);
        } 
    }

    private void SortGridView(string sortExpression, string direction)
    {
        //  You can cache the DataTable for improving performance
        DataTable dt = dtPlayers;

        DataView dv = new DataView(dt);
        dv.Sort = sortExpression + direction;

        gvResults.DataSource = dv;
        gvResults.DataBind();
    }

【问题讨论】:

    标签: c# asp.net sorting gridview


    【解决方案1】:

    最简单的方法可能是修改您的 DataTable 以使用计算数据列。

    您可以通过添加“平均”列并将DataColumn.Expression 属性设置为Won/Played * 100 来做到这一点。然后像绑定任何其他列一样绑定到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多