【问题标题】:Button created after PageLoad - Click Event not firing页面加载后创建的按钮 - 单击事件未触发
【发布时间】:2013-10-21 22:41:34
【问题描述】:

我有一个按钮,用户从下拉菜单中选择某个值后创建,但它没有触发它的 EventHandler。生命周期是否存在某些问题,可能是 OnInit,我必须刷新处理程序才能正确触发?

从 DropDownList 的 OnSelectedIndexChanged

触发的事件
protected void Selected_floor_first(object sender, EventArgs e)
{
    Button btn = new Button();
    btn.ID = "room_button_1";
    btn.Text = "Select";
    btn.Click += new EventHandler(room_1_Click);
    floor_1_room_overlay.Controls.Add(btn);
}

处理程序:(未触发)

protected void room_1_Click(object sender, EventArgs e)
    {
        validation.Text = "You selected a Room";
    }

【问题讨论】:

  • 你能不能只编辑一个预先存在的按钮可见性而不是动态创建它?

标签: c# asp.net .net autopostback


【解决方案1】:

如果您必须动态创建按钮,请在页面的 OnInit() 方法中创建它。

事件处理发生在页面初始化之后。因此,必须在 Page Init 之前创建按钮,以便处理事件。

【讨论】:

    【解决方案2】:

    由于它是动态添加的,因此您必须在每次回发后发生的 Page_Init() 事件中获取该代码。否则当回发发生时,forms.controls 集合中没有 room_button_1 并且错过了该事件。所以

    1. 在添加时添加它。
    2. 添加后在会话中设置一个变量以识别已添加动态控件
    3. 在 page_init() 上检查 step2 的会话变量。如果显示是,则创建您在第 1 步中创建的控件。

    与其重复代码,不如创建一个用于创建按钮的函数并从Select_floor_first()Page_Init() 调用它。

    【讨论】:

      【解决方案3】:

      按钮超出范围配合。将其定义为私有变量,否则事件不会在 Selected_floor_first 方法完成后释放的按钮触发

      private Button btn = new Button();
      
      protected void Selected_floor_first(object sender, EventArgs e)
      {
          btn.ID = "room_button_1";
          btn.Text = "Select";
          btn.Click += new EventHandler(room_1_Click);
          floor_1_room_overlay.Controls.Add(btn);
      }
      
      protected void room_1_Click(object sender, EventArgs e)
      {
              validation.Text = "You selected a Room";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多