【问题标题】:Dynamic button click event created OnPreRender doesn't fire创建的动态按钮单击事件 OnPreRender 不会触发
【发布时间】:2012-05-14 00:04:50
【问题描述】:

我在PreRender 事件中动态创建一个按钮,如下所示:

Button myButton = new Button();
myButton.Text = "Test";
myButton.Click += new EventHandler(myButton_Click);
myDiv.Controls.Add(myButton);

此按钮在浏览器中呈现,但是当我单击该按钮时,单击事件不会触发。我试图在PageLoad 事件中创建一个相同的按钮,它工作正常,但我必须在PreRender 事件中创建这个按钮,因为创建这个动态按钮是否取决于我只在这个事件中获得的值。当我点击在PreRender 中创建的动态按钮时,点击事件会触发,我该怎么办?

【问题讨论】:

    标签: c# asp.net dynamic webforms prerender


    【解决方案1】:

    你应该在预初始化阶段添加按钮,否则它不会触发

    Asp net lifecycle

    将此事件用于以下 (PREINIT):

    • 创建或重新创建动态控件。

    【讨论】:

      【解决方案2】:

      也许在PreRender中创建按钮并在PageLoad中绑定点击事件?

      【讨论】:

        【解决方案3】:

        在 PreRender 中,您可以创建一些 var,它会告诉您,您需要创建按钮。 在 Render 上,使用需要的 JavaScript 或发送表单手动创建该按钮。但是你不能使用 +=EventHandler 这样简单的语法,需要更多的代码。

        【讨论】:

          【解决方案4】:

          根据 MSDN 的此链接,如果需要,您必须在 OnInit() 期间添加与其相关的按钮和事件,如下所述:MSDN Lifecycle

          “在初始化所有控件并应用任何外观设置后引发。各个控件的 Init 事件发生在页面的 Init 事件之前。 使用此事件来读取或初始化控件属性。”

          为此,请尝试类似的方法:

          protected override void OnInit(EventArgs e)
          {
             // Do some stuff here
             base.OnInit(e);
          }
          

          【讨论】:

            【解决方案5】:

            您应该在页面生命周期的早期移动控件创建。控制事件在 Load 之后和 PreRender 之前触发,因此 OnLoad 或更早的任何事情都应该这样做。

            【讨论】:

              【解决方案6】:

              您应该在页面的 OnInit 事件中将您的按钮添加到页面,并在 OnLoad 期间或之前连接它的点击事件,然后您可以启用/禁用您的按钮或使用您在期间拥有的变量使您的按钮可见/不可见预渲染事件。有关更多详细信息,请参阅 Joel Coehoorn 对this question 的回答。否则,请尝试使用 PlaceHolder 控件,尽管这可能会更棘手。

              protected override void OnInit (EventArgs e)
              {
                Button myButton = new Button();
                myButton.Text = "Test";
                myButton.Click += new EventHandler(myButton_Click);
                myDiv.Controls.Add(myButton);
              
                base.OnInit(e);
              }
              
              protected override void OnPreRender(EventArgs e)
              {
                myButton.Visible = myConditional;
              
                base.OnPreRender(e);
              }
              

              【讨论】:

              • 我的问题是我正在循环创建动态按钮。要创建的按钮数量在 PreRender 事件中确定,因为我从 MasterPage 获取此值
              • 页面上是否存在可感知的最大按钮数量?就像在乔尔的回答中一样,您可以选择一个合理的最大值并将它们全部添加到页面中,然后根据您的条件使其可见/不可见。
              • 不,可以有1个,可以有10个,可以有10个以上:/
              • 如果你不介意我问,每个按钮应该做什么?
              • 看看这个帖子 (forums.asp.net/t/1191194.aspx),它显示了事件触发顺序。如果您在母版页加载期间检索按钮计数,那么您不能使用页面加载来添加按钮,因为它发生在母版页加载之前。您可以尝试将按钮添加逻辑放入用户控件加载中,因为用户控件加载在母版页加载后触发。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-02-10
              • 1970-01-01
              • 2018-11-13
              • 2012-08-18
              • 1970-01-01
              • 1970-01-01
              • 2012-01-19
              相关资源
              最近更新 更多