【问题标题】:Timer, UpdatePanel and dynamically created buttons计时器、UpdatePanel 和动态创建的按钮
【发布时间】:2015-07-08 01:25:31
【问题描述】:

我有一个带有 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";
            }



        }

【问题讨论】:

  • 您能发布您的实际代码或类似的代码吗?

标签: c# asp.net


【解决方案1】:

对于动态添加的控件,您必须在每个页面加载事件中添加它们。否则,当它到达点击事件时,它已经消失了。在这种情况下,我会在每次创建按钮时将按钮添加到按钮的会话集合中,然后在每次回发时重新加载整个集合,这样它就不会丢失您已经添加的内容。此外,在您递增的会话中保存一个 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,这意味着您的控件早已不复存在。

【讨论】:

  • 首先,谢谢。在我的定时器事件的真实应用程序中,我根据数据库中不断变化的数据(在线用户列表的种类)创建控件。我必须在没有更新面板的情况下添加,我可以成功地使按钮正常工作,因为我在每次回发时都会重新创建它。问题是我需要更新面板内的按钮,因此每个间隔都会有一个最新的按钮列表,而不会导致整个页面丑陋的回发。问题更加复杂,因为我需要单击按钮将数据加载到另一个更新面板中,而不会导致回发丑陋。
  • 您是否可以发布您的实际代码,或者至少可以发布更准确的代码?
  • 但我想要做的是……我需要每 30 秒更新一次在线用户,而无需回发。根据数据库中更改的数据创建控件的计时器事件(((没有回发)))..如果有人离线,请从页面中删除他如果有人上线,则自动将他添加到页面中,无需回发。
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多