Gridview -sorting事件不起作用

时间:2013-09-13 21:49:02

标签: c# asp.net gridview

我有一个可编辑的GridView,我正在尝试将排序功能添加到指定的列。虽然我没有收到任何错误,但我的排序方法不起作用。我能不能在这里得到一些帮助?

设计:

<asp:GridView ID="gvLogNotice" 
        runat="server" 
        AutoGenerateColumns="false" 
        ShowFooter="false"
        OnRowCancelingEdit="gvLogNotice_RowCancelingEdit"
        OnRowEditing="gvLogNotice_RowEditing" 
        OnRowUpdating="gvLogNotice_RowUpdating"
        EmptyDataText="There are no data records to display."
        DataKeyNames="LogNoticeID"
        AllowPaging="true"
        AllowSorting="true"
        OnSorting="gvLogNotice_sorting"
        Width="700px">
        <Columns>
            <asp:TemplateField HeaderText="Log No." Visible="false">
                <ItemTemplate>
                    <%#Eval("LogNoticeID")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtLogNoticeID" runat="server" Enabled="false" Text=' <%#Eval("LogNoticeID") %>'></asp:TextBox>
                </EditItemTemplate>
             </asp:TemplateField>
            <asp:TemplateField HeaderText="Log Date" SortExpression="DateLogged">
                <ItemTemplate>
                    <%#Eval("DateLogged")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtDateLogged" runat="server" Text=' <%#Eval("DateLogged") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Log Description" HeaderStyle-Width="50px" sortexpression="LogNoticeDescript">
                <ItemTemplate>
                    <%#Eval("LogNoticeDescript")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtLogNoticeDescript" runat="server" Text=' <%#Eval("LogNoticeDescript") %>'></asp:TextBox>
                </EditItemTemplate>
           </asp:TemplateField>
           <asp:TemplateField HeaderText="Responsible Party" sortexpression="ResponsibleParty">
                <ItemTemplate>
                    <%#Eval("ResponsibleParty")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtResponsibleParty" runat="server" Text=' <%#Eval("ResponsibleParty") %>'></asp:TextBox>
                </EditItemTemplate>
          </asp:TemplateField>
             <asp:TemplateField HeaderText="Planned Date" SortExpression="PlannedDate" >
                <ItemTemplate>
                    <%#Eval("PlannedDate")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtPlannedDate" runat="server" Text=' <%#Eval("PlannedDate") %>'></asp:TextBox>
              </EditItemTemplate>
          </asp:TemplateField>
           <asp:TemplateField HeaderText="Case Number" SortExpression="CaseNumber">
                <ItemTemplate>
                    <%#Eval("CaseNumber")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtCaseNumber" runat="server" Text=' <%#Eval("CaseNumber") %>'></asp:TextBox>
              </EditItemTemplate>
          </asp:TemplateField>
             <asp:TemplateField HeaderText="Log Status" SortExpression="LogStatus">
                <ItemTemplate>
                    <%#Eval("LogStatus")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtLogStatus" runat="server" Text=' <%#Eval("LogStatus") %>'></asp:TextBox>
                </EditItemTemplate>
          </asp:TemplateField>
            <asp:TemplateField HeaderText="Edit">
                <ItemTemplate>
                    &nbsp;&nbsp;
                    <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="images/edit.png" Width="25"
                        Height="25" CommandName="Edit" />&nbsp;&nbsp;
                   <%-- <asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="~/img/delete.png" CommandName="Delete"
                        OnClientClick="return confirm('Are you sure want to delete record?')" />--%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Update">Update</asp:LinkButton>&nbsp;&nbsp;
                    <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Cancel">Cancel</asp:LinkButton>
                </EditItemTemplate>
              </asp:TemplateField>
        </Columns>
    </asp:GridView>

代码背后:

//页面加载事件:

 protected void Page_Load(object sender, EventArgs e)
    {
        lblmsg.Text = "";
        if (!Page.IsPostBack)
        {
            gvLogNotice.ShowFooter = false;
            //Load grid data using common method
            LoadGrid();


        }
    }

//将数据绑定到GV并加载

void LoadGrid()
        {
            sqlcmd = new SqlCommand("selectActiveLogs", sqlcon);
            sqlcmd.CommandType = CommandType.StoredProcedure;
            try
            {
                sqlcon.Open();
                da = new SqlDataAdapter(sqlcmd);
                dt.Clear();
                da.Fill(dt);
                gvLogNotice.DataSource = dt;
                gvLogNotice.DataBind();


            }
            catch (Exception ex)
            {

            }
            finally
            {
                sqlcon.Close();
            }
        }

//排序事件

  protected void gvLogNotice_sorting(object sender, GridViewSortEventArgs e)
    {
        switch (e.SortExpression)
        {
            case "DateLogged":
                if (e.SortDirection == SortDirection.Ascending)
                {
                   LoadGrid();
                }
                else
                {
                    LoadGrid();
                }

                break;

           }

    }

1 个答案:

答案 0 :(得分:2)

只有在使用SortDirection属性将GridView绑定到DataSource控件时,才会更改GridView上的DataSourceID属性。否则,需要手动管理排序方向。

在这种情况下,当我们使用DataSource属性向gridView提供数据时,e.SortDirection将始终返回Ascending因此只有你的IF语句才会被执行。

第二点:: 您需要实际优化只是确保定义一个函数来仅返回数据。例如,LoadGrid()只返回DataTable。 这样您就不需要定义LoadGrid()方法的重载 。 Morover,通过适当的实现方式,实际上根本不需要重载。

第三点:: 是你根本不应用排序,而只是加载GridView。当你通过设置DataSource属性并调用{{1}手动数据绑定时你需要手动处理排序操作。

因此,首先将您的sortDirection存储在ViewState中。只需定义一个公共属性来获取/设置相同的。 [注意我们需要根据上面的第1点存储sortDirection值]

DataBind()

public SortDirection SortDirection { get { if (ViewState["SortDirection"] == null) { ViewState["SortDirection"] = SortDirection.Ascending; } return (SortDirection)ViewState["SortDirection"]; } set { ViewState["SortDirection"] = value; } } 事件中,设置OnSorting以及首先对表格进行排序,然后将其加载到gridView中。

sortDirection

最后,你的LoadGrid很好,只有填充表并返回它的东西

 protected void SortRecords(object sender, GridViewSortEventArgs e)
{
     string sortExpression = e.SortExpression;
     string direction = string.Empty;
        if (SortDirection == SortDirection.Ascending)
             {
                  SortDirection = SortDirection.Descending;
                  direction = " DESC";
             }
        else
            {
                 SortDirection = SortDirection.Ascending;
                 direction = " ASC";
            }
    DataTable table = this.LoadGrid(); // or this.GetDataTable(), to get only the DataTable
   // Now apply Sorting to your source of Data
    table.DefaultView.Sort = sortExpression + direction;
   // Bind the GridView
    gvLogNotice.DataSource = table;
    gvLogNotice.DataBind();
}