如何动态添加控件并保留Viewstate?

时间:2014-09-29 17:00:07

标签: asp.net vb.net webforms viewstate

我试图使用Controls.AddAt(),但它显然会破坏以后索引的控件:

这是我最小的例子:

Aspx表格如下:

<asp:DropDownList runat="server" ID="ddl" />
<asp:Button Text="text" runat="server" OnClick="Unnamed2_Click" />

代码背后:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        ddl.Items.Add("Click the button")   
        'Controls.Add(New HyperLink) 'Works fine, but is put at end of collection.
        'Controls.AddAt(2 ,New HyperLink) 'Is also safe but I wanted the control first
        Controls.AddAt(0, New HyperLink) 'ddl loses it's item after postback
    End If
End Sub

在调用AddAt后,在页面的第一个回发中,DropDownList丢失了它的项目。即使HTMLControls我添加了什么样的控制也没关系。 Viewstate未被禁用。

如何在不破坏其他控件的情况下动态添加控件?

1 个答案:

答案 0 :(得分:1)

如果您使用PlaceHolder添加HyperLink,则不会弄乱页面的其余部分:

<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:DropDownList ID="ddl" EnableViewState="true" runat="server" />
<asp:Button ID="bn1" Text="text" OnClick="Unnamed2_Click" runat="server" />

使用类似

的代码
Protected Sub Unnamed2_Click(sender As Object, e As EventArgs) Handles bn1.Click
    Dim newItem = "Click the button" & DateTime.Now.ToString("HH:mm:ss")
    ddl.Items.Add(newItem)
    ddl.SelectedIndex = ddl.Items.Count - 1
    PlaceHolder1.Controls.Add(New HyperLink With {.ID = "hyp", .Text = "Hyperlink here"})

End Sub

如果他们带了一个ID,总是给你asp:Control个。

相关问题