【问题标题】:Sorting Gridview When In Edit Not Working在编辑不工作时对 Gridview 进行排序
【发布时间】:2014-05-12 13:21:02
【问题描述】:

在我的应用程序中,我正在对 gridview 进行排序,并且在该 gridview 中也有 Edit,排序工作正常,但是当我单击 Edit 时,它会将 gridview 置于原始排序顺序中。当我单击“编辑”时 - 它允许我编辑该行,但它会更改顺序并在编辑模式下向我显示该行的原始记录。

private void LoadGridview()
    {
        DataTable dt = new DataTable();

        using (SqlConnection cs = new SqlConnection(connStr))
        {
            if (Session["sortedGV"] == null )
            {
                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("spManagement_GetStationProfile", cs);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@Que", ddlQue.SelectedValue);
                da.Fill(ds);
                dt = ds.Tables[0];

                Session["sortedGV"] = new DataView(dt);
            }
        }
        gvStations.DataSource = Session["sortedGV"];
        gvStations.DataBind();
    }

protected void gvStations_RowCommand(object sender, GridViewCommandEventArgs e)
{
            if (e.CommandName == "EditRow")
            {
                //This enables the EditTemplate
                int rowindex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
                gvStations.EditIndex = rowindex; //Enables the edit row in gridview                        
            }
            else if (e.CommandName == "CancelUpdate")
            {
                gvStations.EditIndex = -1;
            }
            else if (e.CommandName == "UpdateRow")
            {
                //DO SOME STUFF///
                gvStations.EditIndex = -1; //Takes you out of update view      
            }

            if ((DataTable)Session["sortedGV"] != null)
            {                    
                gvStations.DataSource = (DataTable)Session["sortedGV"];
            }
            else
            {
                gvStations.DataSource = LoadGridview();
            }
            gvStations.DataBind();
            btnAddStation.Visible = true;
  }
  private void SortGridview(string sortExpression, string Direction)
    {
        DataView dv = null;
        DataTable dt = gvStations.DataSource as DataTable;
        dv = new DataView(dt);

        dv.Sort = sortExpression + " " + Direction;
        Session["sortedGV"] = dt;
        gvStations.DataSource = dv;
        gvStations.DataBind();

    }

    //Sorts gridview
    protected void gvStations_Sorting(object sender, GridViewSortEventArgs e)
    {
        String sortExpression = e.SortExpression;
        Session["SortExpression"] = sortExpression;

        if (Session["SortDirection"] != null && Session["SortDirection"].ToString() == SortDirection.Descending.ToString())
        {
            Session["SortDirection"] = SortDirection.Ascending;
            SortGridview(sortExpression, "ASC");
        }
        else
        {
            Session["SortDirection"] = SortDirection.Descending;
            SortGridview(sortExpression, "DESC");
        }

    }

网格视图

<asp:GridView ID="gvStations" runat="server" AutoGenerateColumns="False" DataKeyNames="StationID"
            Width="100%" AllowSorting="True" CellPadding="4" ForeColor="#333333" GridLines="None"
            OnRowCommand="gvStations_RowCommand" OnSorting="gvStations_Sorting">
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
            <Columns>
                <asp:TemplateField ShowHeader="False">
                    <ItemTemplate>
                        <asp:LinkButton ID="lbEdit" runat="server" CausesValidation="False" CommandName="EditRow"
                            CommandArgument='<%# Eval("StationId")%>'>Edit</asp:LinkButton>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:LinkButton ID="lbUpdate" runat="server" CausesValidation="True" CommandName="UpdateRow"
                            ForeColor="White" Text="Update" CommandArgument='<%# Eval("StationId")%>'></asp:LinkButton>
                        <asp:LinkButton ID="lbCancel" runat="server" CausesValidation="False" CommandName="CancelUpdate"
                            ForeColor="White" CommandArgument='<%# Eval("StationId")%>' Text="Cancel"></asp:LinkButton>
                    </EditItemTemplate>
                    <FooterStyle HorizontalAlign="Center" />
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:BoundField DataField="StationID" HeaderText="ID" SortExpression="StationID"
                    Visible="false" ReadOnly="true">
                    <ItemStyle HorizontalAlign="Center" />
                </asp:BoundField>
                <%--Station Number--%>
                <asp:TemplateField HeaderText="#" SortExpression="StationNumber">
                    <EditItemTemplate>
                        <asp:TextBox ID="tbStationNumberEdit" runat="server" Text='<%# Eval("StationNumber") %>' />
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbStationNumber" runat="server" Text='<%# Eval("StationNumber") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
              </Columns>  
          </asp:GridView>

【问题讨论】:

  • 将 gvStations_RowCommand 中的数据绑定代码移到顶部或将其全部删除时会发生什么?
  • 它的排序很好。但是当我单击编辑时,它会重新排序为升序,而不是保持降序。
  • 您可以发布 GridView 标记以便我自己进行设置吗?

标签: c# asp.net gridview


【解决方案1】:

您需要将 DataView 保存在会话中并使用它。不是数据表。以下修改使代码工作。另请注意,Sort 命令首先在 RowCommand 方法中运行,然后调用您的 Sorting 方法,因此最好为 RowCommand 事件方法中的每个命令显式绑定数据。

    private string SortExpression
    {
        get { return (string) Session["SortExpression"]; }
        set { Session["SortExpression"] = value; }
    }

    private string Direction
    {
        get { return (string)Session["SortDirection"]; }
        set { Session["SortDirection"] = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LoadGridview();
        }
    }

    protected void gvStations_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "EditRow")
        {
            //This enables the EditTemplate
            int rowindex = ((GridViewRow) ((LinkButton) e.CommandSource).NamingContainer).RowIndex;
            gvStations.EditIndex = rowindex; //Enables the edit row in gridview      

            LoadGridview();
        }
        else if (e.CommandName == "CancelUpdate")
        {
            gvStations.EditIndex = -1;
            LoadGridview();
        }
        else if (e.CommandName == "UpdateRow")
        {
            var dataView = (DataView) Session["sortedGV"];


            //DO SOME STUFF///
            gvStations.EditIndex = -1; //Takes you out of update view     


            LoadGridview();
        }
    }

    private void LoadGridview()
    {
        if (Session["sortedGV"] == null)
        {
            var table = new DataTable();
            table.Columns.Add("StationId", typeof (int));
            table.Columns.Add("StationNumber", typeof (string));
            DataRow row1 = table.NewRow();
            row1["StationId"] = 1;
            row1["StationNumber"] = "343";
            table.Rows.Add(row1);

            DataRow row2 = table.NewRow();
            row2["StationId"] = 2;
            row2["StationNumber"] = "443";
            table.Rows.Add(row2);

            Session["sortedGV"] = new DataView(table);
            SortGrid();
        }


        gvStations.DataSource = Session["sortedGV"];
        gvStations.DataBind();
    }


    private void SortGrid()
    {
        var dv = (DataView) Session["sortedGV"];
        if (SortExpression != null)
        {
            dv.Sort = SortExpression + " " + Direction;

        }
    }


    //Sorts gridview
    protected void gvStations_Sorting(object sender, GridViewSortEventArgs e)
    {
        SortExpression = e.SortExpression;

        if (SortExpression != null &&
            Direction == SortDirection.Descending.ToString())
        {
            Direction = "ASC";
        }
        else
        {
            Direction = "DESC";       
        }
        SortGrid();
        LoadGridview();
    }

【讨论】:

  • 这可行,但是当您点击更新时,它会将其排序回原始顺序。
  • 它不适合我。您确定您正确复制了更改吗?
  • 实际上它确实保持顺序但它不刷新数据。我必须重新加载页面才能使更改生效。
  • 我添加了我的 Loadgridview()
  • 我正要请你这样做。你是说这让它起作用了?还是没有?
猜你喜欢
  • 2011-02-27
  • 2015-10-22
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 2011-04-21
  • 2016-09-06
  • 2011-08-22
相关资源
最近更新 更多