2014-03-27 71 views
0

所以我想了解一些关于使用C#构建页面的知识,以及那些我真的无法得到的东西。 我有以下代码:在代码隐藏中添加按钮代理内部的按钮

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    UpdatePanel mainContainer = new UpdatePanel(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     Label someText = new Label(); 
     someText.Text = "text"; 
     LinkButton someLink = new LinkButton(); 
     someLink.Text = "first link"; 
     someLink.Click += delegate { 
      Label someText2 = new Label(); 
      someText2.Text = "text2"; 
      LinkButton someLink2 = new LinkButton(); 
      someLink2.Text = "second link"; 
      someLink2.Click += delegate { 

       Label someText3 = new Label(); 
       someText3.Text = "text3"; 
       LinkButton someLink3 = new LinkButton(); 
       someLink3.Text = "third link"; 
       mainContainer.ContentTemplateContainer.Controls.Add(someText3); 
       mainContainer.ContentTemplateContainer.Controls.Add(someLink3); 

      }; 
      mainContainer.ContentTemplateContainer.Controls.Add(someText2); 
      mainContainer.ContentTemplateContainer.Controls.Add(someLink2); 

     }; 


     form1.Controls.Add(mainContainer); 
     mainContainer.ContentTemplateContainer.Controls.Add(someText); 
     mainContainer.ContentTemplateContainer.Controls.Add(someLink); 
    } 
} 

总而言之,它应该给的东西很简单,一个UpdatePanel充当包含包装:一个“文本”的字符串,然后“第一链接”的链接和点击在“第一个链接”应该附加另一个字符串和另一个链接旁边的最初的。反过来,这第二个链接应该添加一个新的第三个字符串和一个新的第三个链接。但是,点击第二个链接只会导致从DOM中删除第二个文本和第二个链接。我甚至不能在委托中为第二个链接创建断点。我真的不知道为什么会发生这种情况。有任何想法吗?

我的意图是不断添加html对象到基于点击程序添加对象的网站,这是不是psibible?

+0

对不起 - ASP.NET是没有的WinForms :)控制树有在每次回发后都会重新创建。 –

+0

控制树必须重新创建?我是否需要在新的UpdatePannel中添加新元素? – Axel

+0

是的 - ASP.NET记住它从http POST请求获取的内容 - 即表单字段,cookie和查询字符串参数。一个特别有趣的表单域是ViewState - 您可以使用它来保持状态。控制树(所有动态添加的控件)都以与第一个请求相同的状态回发 - 除非您根据某些信息(通常为ViewState)重新创建它们。 –

回答

0

为了更好地兑现了主意:

假设你有两个控件控制/ Control1.ascx和控制/ Control2.ascx

<asp:ScriptManager runat="server" /> 
<asp:UpdatePanel ID="updatePanel" runat="server"> 
    <ContentTemplate> 
     <asp:LinkButton runat="server" Text="PressMe 1" OnClick="ChangePage_Click" CausesValidation="false" CommandArgument="~/Controls/Control1.ascx" /> 
     <asp:LinkButton runat="server" Text="PressMe 2" OnClick="ChangePage_Click" CausesValidation="false" CommandArgument="~/Controls/Control2.ascx" /> 
     <asp:PlaceHolder runat="server" ID="placeholder" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 


protected void Page_Load(object sender, EventArgs e) { 
    if (IsPostBack && !string.IsNullOrEmpty(ActiveControl)) { 
    placeholder.Controls.Clear(); 
    placeholder.Controls.Add(LoadControl(ActiveControl)); 
    } 
} 

protected string ActiveControl { 
    get { return (string)ViewState["ActiveControl"]; } 
    set { ViewState["ActiveControl"] = value; } 
} 

protected void ChangePage_Click(object sender, EventArgs e) { 
    var control = (IButtonControl)sender; 
    ActiveControl = control.CommandArgument; 
    placeholder.Controls.Clear(); 
    placeholder.Controls.Add(LoadControl(control.CommandArgument)); 
} 
+0

哇,占位符很好地做了这个伎俩,tysm我一直在与此战斗一段时间 – Axel