Gridview复选框在排序期间丢失信息

时间:2011-07-11 19:52:28

标签: asp.net gridview checkbox

所以我在gridview中有这个复选框,它在大多数情况下都能正常工作。但是,我正在尝试对网格实施列排序,这会导致复选框出现问题。当我从数据库进行初始提取时,它会正确填充复选框,但是当我单击列进行排序时,我的所有复选框都会被清除。

似乎这是Databind由gridview完成的问题,但我不确定我做错了什么。我对这个问题的研究让我觉得我说得对,但我不确定(遗留代码:我讨厌它)。

<asp:GridView ID="UserListGrid" runat="server"
    OnSorting="UserListGrid_Sort" AllowSorting = "True" AutoGenerateColumns="False"  
    AllowPaging="True" PageSize="25" OnRowDataBound="UserListGrid_RowDataBound" 
    OnPageIndexChanging="UserListGrid_PageIndexChanging">

。 。

    <ItemTemplate>
       <asp:CheckBox ID="ActiveCheck" runat="server" SortExpression="ActiveCheck"/>                                                   
    </ItemTemplate>

。 。

protected void UserListGrid_Sort(object sender, GridViewSortEventArgs e)
{
        // ViewState["CurTab"] = 0;
        DataTable Data = myData.GetSessionRoster(TeamID);
        DataView UserListView = new DataView(Data);
        ViewState["SortDirection"] = myData.ConvertSortDirectionToSql(ViewState["SortDirection"] == null ? "" : ViewState["SortDirection"].ToString());
        UserListView.Sort = e.SortExpression + " " + ViewState["SortDirection"];
        UserListGrid.DataSource = UserListView;
        UserListGrid.DataBind();
}

我的排序有什么明显的错误吗?如果需要,我可以提供更多代码。

根据要求,这里是UserListGrid_RowDataBound

protected void UserListGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
    {
        return;
    }
    // See which users are active
    CheckBox ActiveCheck = (CheckBox)e.Row.Cells[1].FindControl("ActiveCheck");
    if (ActiveCheck != null)
    {
        ActiveCheck.Enabled = true;
        if (e.Row.Cells[11].Text.Equals("1") && !Page.IsPostBack)
        {
            ActiveCheck.Checked = true;
            ActiveCheck.DataBind();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

看起来您填充的复选框不是来自数据库,而是对应于单元格11的内容(无论它是什么)。 我呼吁这个代码行:

if (e.Row.Cells[11].Text.Equals("1") && !Page.IsPostBack)

在排序时重新绑定gridview,但限制在回发时填充和重新绑定复选框。这可能是复选框丢失值的原因。

答案 1 :(得分:0)

我看不到保存复选框数据的位置。但是,最好的方法是保存最终用户在每次请求时对服务器所做的所有更改。据我所知,数据存储在DataTable中。因此,通常,您应浏览所有网格行,在其中找到CheckBox并将其值保存在此表中。这应该在Page_Load方法中完成。这对于UserListGrid_RowDataBound事件处理程序中的代码正常工作是必要的。