【问题标题】:ASP.NET How can 2 dynamically loaded user controls respond to each others events?ASP.NET 2 个动态加载的用户控件如何响应彼此的事件?
【发布时间】:2009-08-21 01:45:11
【问题描述】:

大家好, 我在一个aspx 页面的page-init 事件中加载了两个ascx。控件 1 有一个单选按钮列表,我希望控件 2 上有一个下拉列表来响应它的 selectedIndex 更改。到目前为止,我在 SelectedIndexChange 处理程序上调用 RaiseBubbleEvent 并传递控件引用和 commandArgs。然后在 aspx 中我重写 OnBubbleEvent 并且我能够接收控件引用和 commandArgs。我的问题是如何将这些信息传递给控件 2。页面不知道控件,因为它们是动态加载并添加到 aspx 中的 asp:PlaceHolders 中的。我需要 Control 2 来知道选择了哪个单选按钮,以便我可以更改控件 2 上下拉列表的数据源。有没有人有这样的例子?任何指针或提示将不胜感激。

谢谢, ~ck 在圣地亚哥

【问题讨论】:

    标签: c# asp.net-ajax ascx event-bubbling


    【解决方案1】:

    嗯,控件 2 应该只是附加到另一个控件的“SelectedIndexChanged”事件。由于某种原因,这不可能吗?

    【讨论】:

      【解决方案2】:

      我不确定这是一个很好的解决方案,但应该可以。为控件 2 中的事件创建一个处理程序,并通过某种方式访问​​该处理程序的委托。然后只需将控件 1 的事件连接到该访问器返回的处理程序。非常粗略的例子:

      在控制1中:

      public event SelectedIndexChanged;
      
      public void PageLoad()
      {
          radioList.SelectedIndexChanged += new EventHandler(RadSelectedIndexChanged);
      }
      
      public void RadSelectedIndexChanged(object sender, EventArgs args)
      {
          SelectedIndexChanged(sender, args);
      }
      

      在aspx页面中:

      control1.SelectedIndexChanged += control2.GetHandler();
      

      在控制2中:

      public EventHandler GetHandler()
      {
          return new EventHandler(HandleEvent);
      }
      
      protected void HandleEvent(object sender, EventArgs args)
      {
      
      }
      

      【讨论】:

        【解决方案3】:

        既然你提到页面不知道这些控件,最好的办法是让 Control1 类公开一个带有 I-want-to-listen-to-your-event setter 方法的接口。

        Control2 应在其父级(页面)中搜索实现该接口的其他同级控件,然后调用 setter 传递对其处理程序的引用。

        这样,控件可以不加修改地拖放到任何其他页面上。

        编辑:

        添加了sample web application 供下载。源代码已发布到公共领域。

        【讨论】:

        • 我喜欢这个主意。如何使用 I-want-to-listen-to-your-event setter 方法创建接口?当你说“setter”时,你的意思是一个属性 {set;} 以及该方法应该返回什么类型。对不起,我在编写事件时有点新手。谢谢。
        • @Kettenbach:添加了示例应用程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        • 2010-11-08
        • 2010-12-18
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多