使用复选框列表进行以下转发器控制:
<asp:Repeater ID="rptItemList" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<div>
<asp:CheckBox ID="chkItem" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ItemName").ToString() %>' />
<asp:HiddenField ID="hdItem" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ItemId").ToString() %>' />
</div>
</ItemTemplate>
<FooterTemplate>
<asp:LinkButton ID="lbtnDel" runat="server" Text="Delete" OnClick="lbtnDel_Click" OnClientClick="return confirm('Are you sure you want to delete selected items from this list?')"></asp:LinkButton>
</FooterTemplate>
</asp:Repeater>
并按照后面的代码来处理lbtnDel_Click事件:
protected void lbtnDel_Click(object sender, EventArgs e)
{
foreach (RepeaterItem ri in rptItemList.Items)
{
CheckBox chk = (CheckBox)ri.FindControl("chkItem");
HiddenField hd = (HiddenField)ri.FindControl("hdItem");
if (chk.Checked)
{
var tc = new ItemController();
tc.DeleteItem(Convert.ToInt32(hd.Value));
}
}
Response.Redirect(DotNetNuke.Common.Globals.NavigateURL());
}
当我选中一个复选框并单击“删除”时,代码会找到该复选框,但会将其读取为未选中状态,因此不会删除该项目。
有什么想法吗?
答案 0 :(得分:10)
不是100%肯定,但是你是否在每个页面加载中进行数据绑定?尝试仅在!IsPostBack
上绑定
每当我遇到这样的问题时,通常是因为页面加载导致转发器重新绑定并杀死所有当前状态
答案 1 :(得分:0)
我在更新面板中有一个转发器。所以RepeaterItem中唯一的控件是DataBoundLiteralControl
这对我有用:
foreach (RepeaterItem item in rpLists.Items)
{
if (item.Controls.Count > 0)
{
DataBoundLiteralControl dbLt = item.Controls[0] as DataBoundLiteralControl;
if (dbLt != null)
{
var controlCollection = this.ParseControl(dbLt.Text);
HtmlInputCheckBox cbInclude = (HtmlInputCheckBox) FindControl(controlCollection, "cbIncludeList");
if (cbInclude != null)
{
if (cbInclude.Checked)
{
//your code here
}
}
}
}
}
我必须为FindControl创建一个递归方法,如果它不是页面的一部分,它就无法正常工作。 耸肩 见ASP.Net FindControl is not working - How come?
private Control FindControl(Control parent, string id)
{
if (parent.ID == id)
return parent;
if (parent.HasControls())
{
foreach (Control childControl in parent.Controls)
{
if (childControl.ID == id)
return childControl;
if (childControl.HasControls())
return FindControl(childControl, id);
}
}
return null;
}