【问题标题】:How do I add events to nested server controls? (ASP.Net)如何将事件添加到嵌套服务器控件? (ASP.Net)
【发布时间】:2010-05-19 18:37:09
【问题描述】:

我正在构建一个自定义母版页类型控件,即有点像数据网格,但应该更容易向其中添加自定义功能。这很好,但部分所需功能是有一个打开和关闭的分页控件,该控件的一部分将是一个显示当前页码的文本框,并且在 TextChanged 上重定向到数据集的新页面。

我遇到的问题是,从技术上讲,触发事件的文本框嵌入在一个控件中,该控件嵌入到您实际放在页面上的控件中

页面
|
显示控制
|
分页控制
|
文本框

事件没有触发。更糟糕的是,回发 javascript 甚至没有被写入页面(到目前为止,页面上没有任何内容回发,这是唯一真正需要的)。

我已经在 Google 上搜索了很长一段时间,并且发现我需要实现 INamingContainer(完成)并且我需要将控件添加到页面的控件树中(Pre_Init 是否为时已晚?什么时候合适?是时候将控件添加到页面了吗?)那么显然应该触发该事件。但是我一直无法找到一个最佳实践的例子,有很多人对按钮感到焦虑,但这不是按钮。

那么任何人都可以向我指出将控件嵌入到控件中的方向,该控件嵌入到添加到页面中的控件中以使其正常运行?

【问题讨论】:

  • 不确定完整的答案,只想解决两个部分:init可以添加控件; pre_init 可能为时过早;其次,事件通常需要冒泡,例如当您单击网格视图中的按钮时,单击事件冒泡到网格以触发适当的事件; RaiseBubbleEvent 是使事件冒泡的方法。似乎 TextBox 没有冒泡更改的事件...
  • 就是这样...冒泡事件。是的。现在,考虑到我已经做出了所有建议的更改,但它仍然不起作用,如何做到这一点。

标签: c# asp.net event-handling


【解决方案1】:

仅当您计划将多个自定义控件实例添加到同一页面时,您才需要 INamingContainer。它所做的是启用唯一 ID 生成,因此您最终不会得到具有相同 ID 的控件。我建议您在创建自定义控件时从 CompositeControl 继承。 Pre_Init 还不算太晚。实际上,考虑到生命周期还为时过早。您可以在很多地方实例化自定义控件并将它们添加到实时控件集合中。我建议您在 Page_Init(加载视图状态之前)或 Page_Load(加载视图状态之后)中执行此操作。即使您在页面生命周期的后期添加它,控件也会赶上事件。 要订阅子控件的事件,您可以使用 FindControl 方法:

MyControl myControl = Page.FindControl("MyControl1");
TextBox textBox = myControl.FindControl("TextBox1") as TextBox;

【讨论】:

  • 这一切都很好,我知道你来自哪里,但是 textchanged 事件必须驻留在分页控件中,而不是驻留页面中。所以从顶级页面订阅活动对我没有帮助。布赖恩在他的评论中谈到的更多的是冒泡的事情。不过还是谢谢。
【解决方案2】:

答案是上述答案和对原始问题的评论的组合。让事件发生的关键是确保您的控件(父控件和子控件)继承自 CompositeControl 和 INamingContainer,例如

public partial myControl:CompositeControl,INamingContainer
etc...

然后您覆盖复合控件的 CreateChildControls() 方法并创建您的控件并在那里进行连线。这将确保正确冒泡。并且意味着事件处理发生在您的复合控件中......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 2010-09-15
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多