【问题标题】:Events inside dynamically created user controls do not fire动态创建的用户控件内的事件不会触发
【发布时间】:2018-11-08 08:22:28
【问题描述】:

我有一个 UserControl,我们称之为 ButtonPanel,它只是面板 (id="bPanel") 中的一个按钮 (id="btn"),以及一个文字(id="msg")。按钮的单击事件绑定到按钮的 ASPX 标记中的事件处理程序 ("btn_Click")。处理程序只需将“Button Pressed”放入上述“msg”字面量中。

在我的主页中,如果我将 ButtonPanel 拖到页面中而不是动态创建它,那么当在控件中触发事件时,就会显示消息。一切正常。

但是,如果我在主页的 Page_Init() 函数中动态创建 ButtonPanel 并将其添加到页面上的容器中,那么 btn_Click 控件中的事件处理程序永远不会被调用。用户控件的 Page_Load()Page_Init() 函数都由 PostBack 调用,但此后不会调用 UserControl 中的事件处理程序。

有人会认为“btn”的 id 会包含在回发数据中,但我无法在 Request.Params 中找到它。如果我能弄清楚用户控件中的哪个控件涉及到,以及涉及到什么事件,我不介意自己调度事件。毕竟不是所有东西都是一个按钮和一个点击事件。

我一直在网上搜索,当然我不是第一个遇到这个问题的人。到目前为止,我还没有找到任何好的解决方案。

如果有来自 Microsoft 的人正在阅读这篇文章...WTF? ASP.NET 已经存在了多少年了?快20了,我想?这从根本上破坏了用户控件的实用性,那么您为什么不解决它呢?

编辑:添加了后续 cmets 的一些细节。

【问题讨论】:

  • 很高兴看到您目前所获得的一些代码。您是否将动态创建的按钮链接到您制作的点击功能? btn.Click += btn_Click 之类的东西?
  • 正如@ikerbera 提到的,您需要附加事件。并确保触发事件的按钮或控件仍然存在于 PostBack 中,否则它不起作用。所以在添加控件时不要使用IsPostBack检查。
  • 在用户控件中,btn_click 事件处理程序绑定到按钮的 ASPX 标记中的控件:在用户控件中,没有动态创建任何内容。
  • 在主页面中,用户控件是在 Page_Init 函数中动态创建并添加到页面中的。 IsPostBack 没有测试。当用户控件中的按钮被按下时,用户控件的 Page_Load 处理程序被调用,因此系统清楚地知道发生了一些事件,但没有调用事件处理程序,并且 Request.Params 的转储未能找到任何证据表明按钮的 ID 已从客户端发送。

标签: c# asp.net


【解决方案1】:

您是否已将事件处理函数映射到事件? https://msdn.microsoft.com/en-us/library/t3d01ft1.aspx

当您将其拖到页面上并添加单击事件属性或代码后处理程序时,它会在幕后为您执行等效的操作。

当你动态添加它时,你必须告诉它把事件映射到处理函数。

【讨论】:

  • 是的,当然事件处理程序是绑定到事件的。这是在按钮的 ASPX 标记中完成的:
  • 是的,当您添加它们预编译时,它是在 .aspx 页面中完成的,而不是,如果您动态添加它们,例如在 Page Init 事件中。正如您的评论 [quote]当用户控件中的按钮被按下时,用户控件的 Page_Load 处理程序被调用,因此系统清楚地知道发生了一些事件,但没有调用事件处理程序[/quote],这是因为浏览器中的 html 知道要回发,但您还没有告诉编译的服务器端代码将处理该特定事件的代码,而无需按照上面的 MSDN 链接映射处理程序。
  • 第三次阅读所有 cmets... 我认为您可能需要您的“ButtonPanel”控件在其上具有“BindEvents()”方法,当控制是在运行时添加的。可能感觉这是由按钮面板的布局定义的,但我们仍在讨论在运行时添加所需事件处理程序的控件树。
  • 我已经尝试将按钮的点击事件绑定到用户控件的Page_Init函数中的处理程序,除了它被绑定在标签中没有任何区别。
  • [link]msdn.microsoft.com/en-us/library/ms178472.aspx[/link] Page 对象调用 Page 对象的 OnLoad 方法,然后递归地对每个子控件执行相同的操作,直到加载页面和所有控件。单个控件的 Load 事件发生在页面的 Load 事件之后。通读并检查在您的情况下触发的顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多