2016-02-12 29 views
0

我使用ItemCreated來創建我的動態控件。但後項後數據庫沒有觸發後,我不能恢復我的控制值與e.Item.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); 
       } 
      } 
     } 
    } 

請幫助我,如果有人能

回答

1

在大多數情況下,動態控件可以被靜態控件替代。由此,您避免了與動態創建控件有關的大量工作和麻煩。這就是說,在你的情況,你可以添加一個MultiViewItemTemplate並顯示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."); 
      } 
     } 
    } 
} 

從我的經驗,動態控件應儘可能長,因爲他們遲早會引起很多麻煩避免。我希望這個答案能讓你瞭解如何在你的場景中實現這一點。

+0

感謝您的支持。我花了很長時間來解決使用動態控件的問題。你救了我的時間:) – user2837480

0

找到了解決辦法.. 可以使用視圖狀態e.Item.ItemIndexID 該解決方案將是有用的人