In an asp:TemplateField column of a GridView, I have a LinkButton that passes a command argument to a function that deletes the row when it is clicked. However, after the GridView is sorted, the LinkButton passes the wrong argument. Also, 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);
        }
    }
