Invalid linkbutton command argument after gridview sort

In the asp: TemplateField GridView column, I have a LinkButton that passes the command argument to a function that deletes the row when clicked. However, after sorting the GridView, LinkButton passes an invalid argument. In addition, the GridView loses the sort order.

What am I doing wrong?

Here is my code:

<!---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); } } 
+4
source share
1 answer

Here is the problem:

When you click LinkButton, the first thing that happens is a page reload. However, Response.Redirect(Request.RawUrl) does not save the ViewState, so the sort order is lost. Therefore, GridView is populated with unsorted data.

Then the LinkButton onClick event function is called. The object passed to this is a LinkButton from the correct row number, but since the sort order of the table has been changed (back to its unsorted state), the LinkButton in this row was no longer the LinkButton that the user clicked. Therefore, the command argument was incorrect.

To fix the problem:

I changed all ViewState [string] to Session [string] (so that the sort direction is preserved when the page reloads) and added the following code to the Page_Load function before binding the GridView:

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

Source: https://habr.com/ru/post/1494761/


All Articles