从下拉列表事件处理程序加载动态控件,如何在按钮事件后保留控件

时间:2011-03-10 22:04:58

标签: asp.net events dynamic handler

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

以下是一个例子:

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;
}
相关问题