所以我在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();
}
}
}
答案 0 :(得分:1)
看起来您填充的复选框不是来自数据库,而是对应于单元格11的内容(无论它是什么)。 我呼吁这个代码行:
if (e.Row.Cells[11].Text.Equals("1") && !Page.IsPostBack)
在排序时重新绑定gridview,但限制在回发时填充和重新绑定复选框。这可能是复选框丢失值的原因。
答案 1 :(得分:0)
我看不到保存复选框数据的位置。但是,最好的方法是保存最终用户在每次请求时对服务器所做的所有更改。据我所知,数据存储在DataTable中。因此,通常,您应浏览所有网格行,在其中找到CheckBox并将其值保存在此表中。这应该在Page_Load方法中完成。这对于UserListGrid_RowDataBound事件处理程序中的代码正常工作是必要的。