回发后无法恢复动态转发器控件值

时间:2016-02-12 09:19:34

标签: c# asp.net

我使用 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);
                }
            }
        }
    }

如果有人可以帮助我

2 个答案:

答案 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 一起使用 这个解决方案对某人有用