网格视图排序事件不起作用

本文关键字:不起作用 事件 排序 视图 网格 | 更新日期: 2023-09-27 18:31:25

我有一个可编辑的网格视图,我正在尝试为指定的列添加排序功能。虽然我没有收到任何错误,但我的排序方法不起作用。我可以就我在这里缺少的内容获得一些帮助吗?

设计:

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

网格视图排序事件不起作用

仅当 GridView

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

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

第二点::你需要优化实际上只是确保你定义一个函数只返回数据,例如说LoadGrid()只返回数据表。这样你就不需要定义 LoadGrid() 方法的重载。Morover,有了正确的实现方式,真的根本不需要重载。

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

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

public SortDirection SortDirection    
{ 
get { 
      if (ViewState["SortDirection"] == null)
            {
                ViewState["SortDirection"] = SortDirection.Ascending;
            }
        return (SortDirection)ViewState["SortDirection"];
     }
set
    {
           ViewState["SortDirection"] = value;
    }
}

OnSorting事件中,设置sortDirection,并首先对表进行排序,然后将其加载到 gridView 中。

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

最后,您的 LoadGrid 很好,只有填满表格并返回它的东西

private DataTable LoadGrid()
{
      DataTable dt = new DataTable();
      sqlcmd = new SqlCommand("selectActiveLogs", sqlcon);
      sqlcmd.CommandType = CommandType.StoredProcedure;
      try
       {
            sqlcon.Open();
            da = new SqlDataAdapter(sqlcmd);
            dt.Clear();
            da.Fill(dt);
            return dt;
       }
      catch (Exception ex)
       {}
}