Timer,UpdatePanel和动态创建的按钮

时间:2015-07-08 01:25:32

标签: c# asp.net

我有一个带div的更新面板(带有runat =“server”),所以我在计时器刻度事件中动态创建并添加按钮。

问题是当点击一个按钮时,它是一个回发但是按钮消失了,并且没有引发事件。

这是我的aspx页面和我的c#代码。我在btn1_click中写的东西实际上都没有发生。

我的问题还有一个问题,但为了简单起见,我想先了解上述内容。

我真的需要你的帮助,我很感激,ty。

<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:Timer ID="Timer1" runat="server" Interval="2000" ontick="Timer1_Tick">
    </asp:Timer>
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
        </Triggers>
        <ContentTemplate>
            <div id="div1" runat="server"></div>
        </ContentTemplate>
    </asp:UpdatePanel>
    <div id="div2" runat="server">div2</div>
    </form>
</body>

和这个c#在这里。

 public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }

            protected void Timer1_Tick(object sender, EventArgs e)
            {
                CreateControl();
            }

            void CreateControl()
            {
                Button btn1 = new Button();
                btn1.ID = "btn1";
                btn1.Text = "click me";
                btn1.Click += new EventHandler(btn1_Click);
                div1.Controls.Add(btn1);
            }

            void btn1_Click(object sender, EventArgs e)
            {
                div1.InnerHtml += "btn1 was clicked";
            }



        }

1 个答案:

答案 0 :(得分:0)

对于动态添加的控件,您必须在每个页面加载事件中添加它们。否则,当它到达click事件时,它已经消失了。在这种情况下,我会在每次创建按钮时将按钮添加到按钮的会话集合中,然后在每次回发时重新加载整个集合,因此它不会丢失您已添加的内容。另外,在你增加的会话中保存一个int,这样它们就不会都有相同的ID。 ID应该是唯一的

类似的东西:

 protected void Page_Load(object sender, EventArgs e)
        {
          if(Page.IsPostBack)
           {
             CreateControls(YourCollectionInSession)
           }
        }
 protected void Timer1_Tick(object sender, EventArgs e)
        {
            CreateControl();
        }
 void CreateControl()
        {
            Button btn1 = new Button();
            btn1.ID = "btn" + yourSessionID;
            btn1.Text = "click me";
            btn1.Click += new EventHandler(btn1_Click);
            div1.Controls.Add(btn1);
            yourSessionID++;
            YourCollectionInSession.Add(btn1);
        }
 void CreateControl(List<Button> buttons)
        {
            foreach(Button btn in buttons)
            {
            div1.Controls.Add(btn); 
            }
        }

之前我必须做同样的事情,这种方法对我有用。记住ASPx Page Lifecycle。在处理任何回发事件之前,它总会点击page_init和page_load,这意味着你的控件已经很久了。