2014-09-29 80 views
0

我试图使用Controls.AddAt(),但在后来的索引它显然打破了控制:如何动态添加控件并保留Viewstate?

这里是我的小例子:

.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未被禁用。

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

+0

我知道我可以在PreInit事件期间安全地添加控件,但是我的实际用例是在回发事件期间添加它们。这是一个简单的问题例子。 – 2014-09-29 17:00:10

回答

1

如果使用占位符超链接添加到,也不会弄乱页面的其余部分:

<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 

而且总是给你的asp:Control秒的ID如果他们拿一个。

+0

虽然这在技术上回答了我的问题(因为我编辑了“不占位符”评论),但它没有解决实际问题。要求在设计时插入占位符是我试图避免的。我想在运行时在运行时选择的位置添加控件。 – 2014-09-29 20:12:50

+0

@DanielCook我不认为有一个很好的非受虐狂的理由,试图对抗ASP.NET设计工作的方式。如果你真的想要的话,你可以使用jQuery和AJAX之类的东西来插入DOM元素,但是你的复杂程度更高。我猜整个页面太复杂,无法完全通过编写* everything *的控件来完成,但是可能只有一部分需要添加控件,因此您可以通过编程方式创建该部分。 – 2014-09-29 20:26:36

+0

看来你是对的。我用我的例子搞砸了一些,并在错误消息中得到了这个gem:“例如,当动态添加控件时,在回发期间添加的控件必须匹配在初始请求期间添加的控件的类型和位置”我很想删除这个问题,但我想我会给你+1,让我更好地理解为什么我试图做的事情不应该起作用。 – 2014-09-29 20:38:40

相关问题