0

I am using a asp gridview with BoundFields and TemplatedFields.

<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>

I have managed to sort Boundfields and RepairId Templated Field correctly, but since my TemplatedField ProblemCategory does not have its text in the DataSource and will be filled like this

 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 />";
    }
}

In the Grid_SelectedIndexChanged I have done special case for sort event args, in witch i define the DataSource, as it should be.

Is there any possibility to sort the TemplatedField by its text and not its value in DB?

Hugo Vrana
  • 173
  • 1
  • 3
  • 15

1 Answers1

0

Solution one: 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 >

Solution 2 Sort 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();
    }
}

Solution 3 Sort with custom templates:

<asp:TemplateField HeaderText="Category" SortExpression="Category">
   <ItemTemplate>A value</ItemTemplate>
</asp:TemplateField>
Barr J
  • 10,636
  • 1
  • 28
  • 46