asp.net - 排序gridview后错误的linkbutton命令参数

标签 asp.net sorting gridview linkbutton commandargument

在 GridView 的 asp:TemplateField 列中,我有一个 LinkBut​​ton,它将命令参数传递给一个函数,该函数在单击该行时将其删除。但是,GridView 排序后,LinkBut​​ton 传递了错误的参数。此外,GridView 会丢失排序顺序。

我究竟做错了什么?

这是我的代码:

<!---master page---->
<asp:GridView runat="server" ID="companies_grid" AllowSorting="true"
    AutoGenerateColumns="false" OnSorting="companies_grid_OnSorting"
    OnRowDataBound="companies_grid_OnRowDataBound" >
        <Columns>
            <%--Company Name--%>
            <asp:TemplateField HeaderText="Company Name" SortExpression="Name">
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server"
                         OnClick="removeCompany_click" />
                     <a href='<%#Eval("URL")%>'><%#Eval("Name")%></a>
                </ItemTemplate>
             </asp:TemplateField>
            //more columns

<!---code behind---->
    protected void Page_Load(object sender, EventArgs e)
    {
        companies = GetCompanyData();

        companies_grid.DataSource = companies;
        companies_grid.DataBind();
    }

    protected void companies_grid_OnSorting(object sender, GridViewSortEventArgs e)
    {
        //sort is made up of column to sort by + direction
        companies.DefaultView.Sort = e.SortExpression.ToString() + " " + GetSortDirection(e.SortExpression, "companiesExpression", "companiesDirection");
        companies_grid.DataSource = companies;
        companies_grid.DataBind();

    }

    private string GetSortDirection(string column, string expressionViewState, string directionViewState)
    {
        // By default, set the sort direction to ascending.
        string sortDirection = "ASC";

        // Retrieve the last column that was sorted.
        string sortExpression = ViewState[expressionViewState] as string;

        if (sortExpression != null)
        {
            // Check if the same column is being sorted.
            // Otherwise, the default value can be returned.
            if (sortExpression == column)
            {
                string lastDirection = ViewState[directionViewState] as string;
                if ((lastDirection != null) && (lastDirection == "ASC"))
                {
                    sortDirection = "DESC";
                }
            }
        }

        // Save new values in ViewState.
        ViewState[directionViewState] = sortDirection;
        ViewState[expressionViewState] = column;

        return sortDirection;
    }

    protected void companies_grid_OnRowDataBound(Object Sender, GridViewRowEventArgs e)
    {
        GridViewRow currRow = e.Row;

        if (currRow.RowType == DataControlRowType.DataRow)
        {
            LinkButton deleteCompButton = (LinkButton)e.Row.FindControl("LinkButton1") as LinkButton;
            deleteCompButton.CommandArgument = ((DataRowView)e.Row.DataItem)["Company_ID"].ToString();
            deleteCompButton.Text = ((DataRowView)e.Row.DataItem)["Company_ID"].ToString();
        }
    }

    protected void removeCompany_click(Object sender, EventArgs e)
    {
        bool removeSuccess = false;

        string idToDelete = ((LinkButton)sender).CommandArgument as string;
        removeSuccess = UserInfo.DeleteCompany(idToDelete);
        if (removeSuccess)
        {
            Response.Redirect(Request.RawUrl);
        }
    }

最佳答案

这是问题所在:

单击 LinkBut​​ton 时,首先发生的是页面重新加载。但是,Response.Redirect(Request.RawUrl)不保留 ViewState,因此排序顺序丢失。因此,GridView 将重新填充未排序的数据。

然后,调用 LinkBut​​ton onClick 事件函数。传入的 Object 是来自正确行号的 LinkBut​​ton,但由于表的排序顺序已更改(恢复到未排序状态),该行中的 LinkBut​​ton 不再是用户单击的 LinkBut​​ton。因此,命令参数是错误的。

要解决此问题:

我将所有 ViewState[string] 更改为 Session[string] (以便在页面重新加载时保留排序方向),并在绑定(bind) GridView 之前在 Page_Load 函数中添加以下代码:

if (Session["companiesExpression"] != null 
     && Session["companiesDirection"] != null)
{
     companies.DefaultView.Sort = Session["companiesExpression"] + " " +
          Session["companiesDirection"];
 }

关于asp.net - 排序gridview后错误的linkbutton命令参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17996949/

相关文章:

c# - 无法将 System.Web.UI.WebControls.Label 类型的对象转换为类型 System.IConvertible

c# - 为 Web 服务创建 XML 字符串

c# - 如何以编程方式重启 MVC4 项目

javascript - 为什么我无法对 firebase 查询返回的日期数组进行排序?

list - 使用 TCL 查找字典中值的最大绝对值

javascript - 循环之前的数组排序不保持数组排序

c# - 如何通过Javascript检查CheckBoxList的值

c# - 将 UTC 日期时间保存在数据库中

在 gridview 中滚动后,Android textview 不显示。

c# - ASP.NET Gridview RowUpdating 事件未触发