PhamMinh
PhamMinh

Reputation: 2665

Sorting event in gridview not fired

I googled a lot of times but don't have any userful link for my solution. I have AllwSorting="true" and OnSort function. Today I post this question, thanks for all your help. This is my ASCX:

<asp:GridView ID="gvwCus" runat="server" CssClass="gridview" AlternatingRowStyle-CssClass="even" AutoGenerateColumns="false" GridLines="Vertical" AllowPaging="false" OnRowCommand="RowCommand" AllowSorting="true" OnSorting="gvwCus_OnSorting">
  <Columns>
     <asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" HeaderStyle-Width="4%">
        <HeaderTemplate>STT</HeaderTemplate>
        <ItemTemplate>
          <asp:Label ID="lblId" runat="server" Text="<%#Container.DataItemIndex + 1%>"></asp:Label>
        </ItemTemplate>
     </asp:TemplateField>
     <asp:BoundField HeaderStyle-Width="12%" DataField="field1" HeaderText="Field1_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
     <asp:BoundField HeaderStyle-Width="30%" DataField="field2" HeaderText="Field2_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
     <asp:BoundField HeaderStyle-Width="31%" DataField="field3" HeaderText="Field3_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
     <asp:BoundField HeaderStyle-Width="20%" DataField="field4" HeaderText="Field4_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center" />
     <asp:CommandField HeaderStyle-Width="2%" ButtonType="Image" SelectImageUrl="~/Images/detail.png" ShowSelectButton="true" />
  </Columns>
</asp:GridView>

And my code behind: ASCX.CS, I have gvwCus_OnSorting function for Sort event, but don't have any event handled when I click on the header of gridview.

protected void gvwCus_OnSorting(object sender, GridViewSortEventArgs e)
{
   DataBind(e);
}

private void DataBind(GridViewSortEventArgs eventArgs)
{
   var dataOracle = new DataOracle();
   var data = dataOracle.GetDataTable();
   if(eventArgs != null)
   {
      data.DefaultView.Sort = eventArgs.SortExpression + " " + GetSortDirection(eventArgs.SortExpression);
   }
   gvwCustom.DataSource = data;
   gvwCustom.DataBind();
}

private string GetSortDirection(string column)
{
string sortDirection = "DESC";
string sortExpression = ViewState["SortExpression"] as string;

if (sortExpression != null)
{
    if (sortExpression == column)
    {
        string lastDirection = ViewState["SortDirection"] as string;
        if ((lastDirection != null) && (lastDirection == "DESC"))
        {
            sortDirection = "ASC";
        }
    }
}

ViewState["SortDirection"] = sortDirection;
ViewState["SortExpression"] = column;

return sortDirection;
}

Thanks!!

Upvotes: 2

Views: 3368

Answers (1)

afzalulh
afzalulh

Reputation: 7943

You are not setting SortExpression for the columns you want to sort. Add SortExpression, you will see hyperlinks for each column. Clicking on those links will fire sort event. After adding sortexpression your boundfields should look like:

 <asp:BoundField SortExpression="field1" HeaderStyle-Width="12%" DataField="field1" HeaderText="Field1_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
 <asp:BoundField SortExpression="field2" HeaderStyle-Width="30%" DataField="field2" HeaderText="Field2_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
 <asp:BoundField SortExpression="field3" HeaderStyle-Width="31%" DataField="field3" HeaderText="Field3_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
 <asp:BoundField SortExpression="field4" HeaderStyle-Width="20%" DataField="field4" HeaderText="Field4_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center" />

Rendered headers should look like below:

enter image description here

Upvotes: 3

Related Questions