загрузить динамический элемент управления из обработчика событий раскрывающегося списка, как сохранить элемент управления после события кнопки

Я понимаю, что мне нужно загружать динамическое управление при каждой обратной передаче и предпочтительно в Page_Init(). Но мои динамические элементы управления загружаются из выпадающего списка обработчика событий selectedindexchanged. Теперь после любой обратной передачи мои динамические элементы управления исчезли. Как заставить его загружаться при каждой обратной передаче?

Большое спасибо!


person user570185    schedule 10.03.2011    source источник
comment
aspsnippets.com/Articles/   -  person adt    schedule 11.03.2011


Ответы (1)


Вы должны где-то хранить количество созданных элементов управления. Для этой цели я рекомендую ViewState. Затем вам нужно воссоздать динамически созданные элементы управления для каждой обратной передачи с тем же идентификатором, что и раньше. Поскольку ViewState доступно в Page_Load, я бы использовал это событие. В SelectedIndexChanged-Eventhandler вашего DropdownList вы добавляете элементы управления и соответственно увеличиваете 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>

ВБ.Нет

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;
}
person Tim Schmelter    schedule 10.03.2011
comment
Спасибо!! Я поместил createcontrol в OnInit(), и там он тоже работает! - person user570185; 11.03.2011