我使用 ItemCreated 来创建动态控件。但是在 ItemDataBound 未触发后回复帖子后,我无法使用 e.Item.DataItem 恢复我的控件值。回发后, DataItem 为空。我怎样才能恢复我的价值观......?我的代码如下所示
protected void rptV_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
if (** condition 01 **)
{
if (** condition 01 **)
{
RadioButton rdoBtn = new RadioButton();
rdoBtn.ID = "rbtnID";
rdoBtn.EnableViewState = true;
rdoBtn.GroupName = "GroupName";
rdoBtn.AutoPostBack = true;
rdoBtn.Attributes.Add("value", (e.Item.DataItem != null) ? DataBinder.Eval(e.Item.DataItem, "UserID").ToString() : "");
rdoBtn.CheckedChanged += new System.EventHandler(this.rdoBtnChecked_Changed);
Panel pnlRbtnSet = e.Item.FindControl("pnlSelect") as Panel;
pnlRbtnSet.Controls.Add(rdoBtn);
}
else
{
CheckBox chkBox = new CheckBox();
chkBox.ID = "chkBxID";
chkBox.Checked = true;
chkBox.EnableViewState = true;
chkBox.Attributes.Add("value", (e.Item.DataItem != null) ? DataBinder.Eval(e.Item.DataItem, "UserID").ToString() : "");
Panel pnlChkBoxesSet = e.Item.FindControl("pnlSelect") as Panel;
pnlChkBoxesSet.Controls.Add(chkBox);
}
}
}
}
如果有人可以帮助我
答案 0 :(得分:1)
在大多数情况下,动态控件可以用静态控件代替。通过这种方式,您可以避免与动态创建控件相关的大量工作和麻烦。也就是说,在您的情况下,您可以向ItemTemplate
添加View
并显示适合该记录的<asp:Repeater ID="rpt" runat="server" OnItemDataBound="rpt_ItemDataBound">
<ItemTemplate>
<asp:MultiView ID="multiView" runat="server">
<asp:View runat="server">
<asp:RadioButton ID="radioBtn" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>' Checked='<%# DataBinder.Eval(Container.DataItem, "Checked") %>' />
</asp:View>
<asp:View runat="server">
<asp:CheckBox ID="checkBox" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>' Checked='<%# DataBinder.Eval(Container.DataItem, "Checked") %>' />
</asp:View>
</asp:MultiView>
</ItemTemplate>
</asp:Repeater>
:
public class Item
{
public int Index { get; set; }
public string Text { get; set; }
public bool Checked { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
var data = Enumerable.Range(1, 6)
.Select(x => new Item() { Index = x,
Text = "Item " + x.ToString(),
Checked = (x % 2) == 0 });
rpt.DataSource = data;
rpt.DataBind();
}
}
在示例中,我使用以下类来表示数据项:
ItemDataBound
在protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
var multiView = (MultiView)e.Item.FindControl("multiView");
multiView.ActiveViewIndex = ((Item)e.Item.DataItem).Index % 2;
}
}
事件中,您可以根据需要设置活动视图:
PostBack
在protected void btn_Click(object sender, EventArgs e)
{
var lst = new List<string>();
foreach (RepeaterItem item in rpt.Items)
{
if (item.ItemType == ListItemType.Item ||
item.ItemType == ListItemType.AlternatingItem)
{
var multiView = (MultiView)item.FindControl("multiView");
if (multiView.ActiveViewIndex == 0)
{
var radioBtn = (RadioButton)item.FindControl("radioBtn");
lst.Add("Radio button is " + (radioBtn.Checked ? "" : "not ") + "checked.");
}
else
{
var checkBox = (CheckBox)item.FindControl("checkBox");
lst.Add("Check box is " + (checkBox.Checked ? "" : "not ") + "checked.");
}
}
}
}
中,您可以访问Repeater项目的静态控件:
LinearLayout
根据我的经验,应尽可能避免动态控制,因为它们迟早会造成很多麻烦。我希望这个答案能让您了解如何在您的场景中实现这一目标。
答案 1 :(得分:0)
找到了解决方案.. 可以将 viewstate 与 e.Item.ItemIndexID 一起使用 这个解决方案对某人有用