【问题标题】:asp net grid view sort bound fields by textasp net grid view 按文本对绑定字段进行排序
【发布时间】:2017-11-28 08:58:14
【问题描述】:

我正在使用带有 BoundFields 和 TemplatedFields 的 asp gridview。

<asp:GridView ID="RepairGrid" runat="server" CssClass="subitem w100p" 
   AutoGenerateColumns="False"
              OnRowCommand="RepairGrid_SelectedIndexChanged" OnRowDataBound="RepairGrid_RowDataBound" 
              AllowSorting="True" OnSorting="SortGrid">
    <RowStyle CssClass="itemRowStyle"/>
    <AlternatingRowStyle CssClass="alternatingItemRowStyle"/>
    <HeaderStyle CssClass="headerRowStyle"/>
    <Columns>
        <asp:TemplateField HeaderText="PDF" ItemStyle-CssClass="itemFieldStyle"
                           meta:resourcekey="ColumnPDF" HeaderStyle-CssClass="headerFieldStyle">
            <ItemTemplate>
                <asp:ImageButton ID="btnExportPDF" runat="server" CommandArgument='<%# Eval("RepairId") %>'
                                 CommandName="ExportPDF" ImageUrl='<%# "~/App_Themes/" + Page.Theme + "/icons/16/icon_pdf.png" %>'/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="RepairId" SortExpression="RepairId" ItemStyle-CssClass="itemFieldStyle"
                           meta:resourcekey="ColumnRepairId" HeaderStyle-CssClass="headerFieldStyle" >
            <ItemTemplate>
                <asp:LinkButton ID="lnkRepairId" CommandArgument='<%# Eval("RepairId") %>' CommandName="Redirect"
                                runat="server" Text='<%# Eval("RepairId") %>'/>
                <asp:Label ID="lblRepairId" runat="server" Text='<%# Eval("RepairId") %>'/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ProblemCategory" SortExpression="InternalDescription" ItemStyle-CssClass="itemFieldStyle"
                           meta:resourcekey="repairItemText" HeaderStyle-CssClass="headerFieldStyle">
            <ItemTemplate>
                <asp:LinkButton ID="lnkProblemCategory" CommandArgument='<%# Eval("RepairId") %>' CommandName="Redirect"
                                runat="server"/>
                <asp:Label ID="lblProblemCategory" runat="server"/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="CreateDate" HeaderText="Status" SortExpression="CreateDate" ItemStyle-CssClass="itemFieldStyle"
                        meta:resourcekey="ColumnCreateDate" HeaderStyle-CssClass="headerFieldStyle"/>
        <asp:BoundField DataField="CreateUser" HeaderText="Status" SortExpression="CreateUser" ItemStyle-CssClass="itemFieldStyle"
                        meta:resourcekey="ColumnCreateUser" HeaderStyle-CssClass="headerFieldStyle"/>
        <asp:BoundField DataField="ChangeDate" HeaderText="Status" SortExpression="ChangeDate" ItemStyle-CssClass="itemFieldStyle"
                        meta:resourcekey="ColumnChangeDate" HeaderStyle-CssClass="headerFieldStyle"/>
        <asp:BoundField DataField="ChangeUser" HeaderText="Status" SortExpression="ChangeUser" ItemStyle-CssClass="itemFieldStyle"
                        meta:resourcekey="ColumnChangeUser" HeaderStyle-CssClass="headerFieldStyle"/>
    </Columns>
</asp:GridView>

我已经成功地对 Boundfields 和 RepairId 模板字段进行了正确排序,但是由于我的 TemplatedField ProblemCategory 在 DataSource 中没有它的文本,因此会像这样填充

 foreach (RepairDataSet.tms_v_Repair_RepairItemRow row in tblCategories)
 {
    RepairDataSet.tms_RepairItemDataTable repItemTbl = new RepairDataSet.tms_RepairItemDataTable();
    repItemTbl = repairBo.GetRepairItem(row.RepairItemId);
    if (repItemTbl.Count > 0)
    {
       lnkProblemCategory.Text += "<br />" + repItemTbl[0].TextKey;
    }
    else
    {
       lnkProblemCategory.Text += "<br />";
    }
}

在 Grid_SelectedIndexChanged 中,我为排序事件 args 做了特殊情况,在女巫中我定义了 DataSource,因为它应该是。

是否有可能通过其文本而不是其在 DB 中的值对 TemplatedField 进行排序?

【问题讨论】:

    标签: c# asp.net sorting


    【解决方案1】:

    解决方案一:Sort Menually

    <asp:TemplateField>
                <HeaderTemplate>
                    <asp:LinkButton ID="LinkButtonEmpName" runat="server" Text="Employee Name" CommandName="Sort" CommandArgument="Employees">
                    </asp:LinkButton>
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:Label ID="LabelEmployee" runat="server" Text='<%# Bind("Employees") %>'/>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="TextBoxEmployee" runat="server"/>
                </FooterTemplate>
    </asp:TemplateField >
    

    解决方案 2Sort By Columnd:

    <asp:TemplateField SortExpression="Status">
        <HeaderTemplate>
            <asp:LinkButton ID="lnkSort" runat="server" Text="Status" CommandName="Sort" CommandArgument="Status" />
        </HeaderTemplate>
    </asp:TemplateField>
    
    protected void grd_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName.Equals("Sort"))
        {
            FilterExpression = e.CommandArgument.ToString() + " LIKE '%" + txtCaseNumber.Text + "%'";
            BindGridView();
        }
    }
    

    解决方案 3Sort with custom templates:

    <asp:TemplateField HeaderText="Category" SortExpression="Category">
       <ItemTemplate>A value</ItemTemplate>
    </asp:TemplateField>
    

    【讨论】:

    • 嗨,我认为你的解决方案 2 是最好的,但我不确定这个 FilterExpression 类应该是什么。你能解释一下吗?
    • 可选,过滤服务器端结果的条件
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2019-08-31
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多