在 gridview 中完成的更改不会显示在后面的代码中
Changes done in gridview doesn't show up in code behind
我的 aspx 中有一个 gridview,它绑定到数据库中的数据。它有一个复选框。当我从客户端更改选中状态时,更改不会显示在后面的代码中。知道为什么会这样吗?
<asp:Button OnClick="Btn_Click" CommandArgument="<%# GridViewUserList %>" runat="server" Text="Save" />
<asp:GridView runat="server" ID="GridViewUserList" AutoGenerateColumns="false" ShowFooter="false" ShowHeader="true" Width="100%">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:Label ID="isSelectHeader" runat="server" Text="Assign" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="isAssigned" runat="server" Checked='<%#DataBinder.Eval(Container.DataItem, "IsAssigned") %>'/>
</ItemTemplate>
<ItemStyle Width="5%" HorizontalAlign="Center" VerticalAlign="top" />
<FooterStyle Width="5%" HorizontalAlign="Center" VerticalAlign="top" />
<HeaderStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:BoundField DataField="Salutation" HeaderText="User"/>
</Columns>
</asp:GridView>
下面是我的代码。
protected void Btn_Click(object sender, EventArgs e)
{
for (int i = 0; i < userLicenseList.Count; i++)
{
var isAssigned = GridViewUserList.Rows[i].FindControl("isAssigned") as CheckBox;
if (isAssigned.Checked != userLicenseList.ElementAt(i).IsAssigned)
{
//some code
}
}
}
isAssigned.Checked
是以前的值,不是更改后的值。
userLicenseList
有来自数据库的数据。
您可以编写代码以在单击按钮时查找复选框值,如下所示。
protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow gvr in GridView1.Rows)
{
if (((CheckBox)gvr.FindControl("isAssigned")).Checked == true)
{
//Your logic here .
}
else
{
//Your logic here.
}
}
}
您必须在 IsPostBack 检查旁边绑定您的 GridView 数据。否则选中的状态将被绑定到 GridView 的数据覆盖,您将丢失用户所做的所有更改。
protected void Page_Load(object sender, EventArgs e)
{
//not here
GridViewUserList.DataSource = source;
GridViewUserList.DataBind();
if (IsPostBack == false)
{
//but bind data here...
GridViewUserList.DataSource = source;
GridViewUserList.DataBind();
}
}
我的 aspx 中有一个 gridview,它绑定到数据库中的数据。它有一个复选框。当我从客户端更改选中状态时,更改不会显示在后面的代码中。知道为什么会这样吗?
<asp:Button OnClick="Btn_Click" CommandArgument="<%# GridViewUserList %>" runat="server" Text="Save" />
<asp:GridView runat="server" ID="GridViewUserList" AutoGenerateColumns="false" ShowFooter="false" ShowHeader="true" Width="100%">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:Label ID="isSelectHeader" runat="server" Text="Assign" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="isAssigned" runat="server" Checked='<%#DataBinder.Eval(Container.DataItem, "IsAssigned") %>'/>
</ItemTemplate>
<ItemStyle Width="5%" HorizontalAlign="Center" VerticalAlign="top" />
<FooterStyle Width="5%" HorizontalAlign="Center" VerticalAlign="top" />
<HeaderStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:BoundField DataField="Salutation" HeaderText="User"/>
</Columns>
</asp:GridView>
下面是我的代码。
protected void Btn_Click(object sender, EventArgs e)
{
for (int i = 0; i < userLicenseList.Count; i++)
{
var isAssigned = GridViewUserList.Rows[i].FindControl("isAssigned") as CheckBox;
if (isAssigned.Checked != userLicenseList.ElementAt(i).IsAssigned)
{
//some code
}
}
}
isAssigned.Checked
是以前的值,不是更改后的值。
userLicenseList
有来自数据库的数据。
您可以编写代码以在单击按钮时查找复选框值,如下所示。
protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow gvr in GridView1.Rows)
{
if (((CheckBox)gvr.FindControl("isAssigned")).Checked == true)
{
//Your logic here .
}
else
{
//Your logic here.
}
}
}
您必须在 IsPostBack 检查旁边绑定您的 GridView 数据。否则选中的状态将被绑定到 GridView 的数据覆盖,您将丢失用户所做的所有更改。
protected void Page_Load(object sender, EventArgs e)
{
//not here
GridViewUserList.DataSource = source;
GridViewUserList.DataBind();
if (IsPostBack == false)
{
//but bind data here...
GridViewUserList.DataSource = source;
GridViewUserList.DataBind();
}
}