2011-03-10 77 views
0

我知道我需要在每次回发中加载我的动态控制,最好在Page_Init()中加载。但是我的dyanmic控件从下拉列表selectedindexchanged事件处理程序中加载。现在任何回传之后,我的动态控件都消失了。我将如何强制它在每次回传中加载?加载来自dropdownlist事件处理程序的动态控制,如何在按钮事件后保留控件

非常感谢!

+0

http://www.aspsnippets.com/Articles /Creating-Dynamic-DropDownList-Controls-in-ASP.Net.aspx – adt 2011-03-10 22:08:15

回答

1

您必须将创建的控件的数量存储在某处。为此我推荐ViewState。然后,您必须在每次回发中重新创建与之前相同的ID的动态创建的控件。因为ViewStatePage_Load可用我会使用此事件。在您的DropdownList的SelectedIndexChanged -Eventhandler中,您添加了控件并相应地增加了ViewState -Variable。

下面是一个例子:

ASPX:

<asp:placeholder ID="Container" runat="server"></asp:placeholder><br/> 
<asp:Label ID="LblInfo" runat="server"></asp:Label><br /> 
<asp:DropDownList ID="DdlAddControls" OnSelectedIndexChanged="DdlAddControls_SelectedIndexChanged" AutoPostBack="true" runat="server"> 
    <asp:ListItem Text="" Value="0"></asp:ListItem> 
    <asp:ListItem Text="add 1 button" Value="1"></asp:ListItem> 
    <asp:ListItem Text="add 2 buttons" Value="2"></asp:ListItem> 
    <asp:ListItem Text="add 3 buttons" Value="3"></asp:ListItem> 
</asp:DropDownList> 

VB.Net

Private Property ControlCount As Int32 
    Get 
     If ViewState("ControlCount") Is Nothing Then 
      ViewState("ControlCount") = 0 
     End If 
     Return DirectCast(ViewState("ControlCount"), Int32) 
    End Get 
    Set(ByVal value As Int32) 
     ViewState("ControlCount") = value 
    End Set 
End Property 

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If ControlCount <> 0 Then 
     RecreateControls() 
    End If 
End Sub 

Private Sub RecreateControls() 
    addControls(ControlCount) 
End Sub 

Private Sub addControls(ByVal count As Int32) 
    For i As Int32 = 1 To count 
     Dim btn As New Button() ' i use a Button as example' 
     btn.ID = "Button_" & Me.Container.Controls.Count 
     btn.Text = "Button " & Me.Container.Controls.Count 
     AddHandler btn.Click, AddressOf Click 
     Me.Container.Controls.Add(btn) 
    Next 
End Sub 

Private Sub Click(ByVal sender As Object, ByVal e As EventArgs) 
    LblInfo.Text = DirectCast(sender, Button).Id & "clicked" 
End Sub 

Protected Sub DdlAddControls_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DdlAddControls.SelectedIndexChanged 
    Dim newControlCount As Int32 = Int32.Parse(DdlAddControls.SelectedValue) 
    addControls(newControlCount) 
    ControlCount += newControlCount 
End Sub 

C#

private Int32 ControlCount { 
    get { 
     if (ViewState("ControlCount") == null) { 
      ViewState("ControlCount") = 0; 
     } 
     return (Int32)ViewState("ControlCount"); 
    } 
    set { ViewState("ControlCount") = value; } 
} 

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (ControlCount != 0) { 
     RecreateControls(); 
    } 
} 

private void RecreateControls() 
{ 
    addControls(ControlCount); 
} 

private void addControls(Int32 count) 
{ 
    for (Int32 i = 1; i <= count; i++) { 
     Button btn = new Button(); 
     // i use a Button as example' 
     btn.ID = "Button_" + this.Container.Controls.Count; 
     btn.Text = "Button " + this.Container.Controls.Count; 
     btn.Click += Click; 
     this.Container.Controls.Add(btn); 
    } 
} 

private void Click(object sender, EventArgs e) 
{ 
    LblInfo.Text = ((Button)sender).Id + "clicked"; 
} 

Protected void DdlAddControls_SelectedIndexChanged(object sender, System.EventArgs e) 
{ 
    Int32 newControlCount = Int32.Parse(DdlAddControls.SelectedValue); 
    addControls(newControlCount); 
    ControlCount += newControlCount; 
} 
+0

谢谢!我把CreateControl放在OnInit()中,它也可以在那里工作! – user570185 2011-03-11 17:05:54

相关问题