如何在一个用户控件中消费另一个用户控件的自定义事件?

4
在UserControl1中,我有一个自定义事件,我想在UserControl2中进行连接。
在UserControl1中,我已声明自定义事件为:
 public event MYDelegate SendMessage;

我的代理定义在其他类库中,如下:

public delegate string MYDelegate(string message);

我在我的代码中使用以下方式触发SendMessage:

  SendMessage(txt.Text);

请指导我如何在UserControl2中连接SendMessage()事件。我的想法是像下面的例子一样做些事情,但不确定如何在UserControl2中获取/访问UserControl1对象。

请帮助我。

UserControl1.SendMessge+=ListnerMetod();

1
这两个用户控件是否由同一个父级主机托管? - Mark Hall
听起来你想使用消息总线,这样它看起来就像这样:http://www.ronaldwidha.net/2010/05/31/a-simple-example-of-the-webformsmvp-cross-presenter-messaging/。 - Jeremy Thompson
2个回答

4

你已经接近成功了,你只需要将SendMessage附加到UserControl2的ListnerMetod上。

就像Mark Hall所说,不建议从一个控件向另一个控件触发事件而父页面却一无所知。

以下是通过父页面触发事件的示例代码。

Default.aspx(父页面)

<%@ Register Src="SenderUserControl.ascx" TagName="SenderUserControl" 
  TagPrefix="uc1" %>
<%@ Register Src="ReceiverUserControl.ascx" TagName="ReceiverUserControl" 
  TagPrefix="uc2" %>
<uc1:SenderUserControl ID="SenderUserControl1" runat="server" />
<uc2:ReceiverUserControl ID="ReceiverUserControl1" runat="server" />

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SenderUserControl1.SendMessage += m => ReceiverUserControl1.ListnerMethod(m);
    }
}

SenderUserControl.ascx

public delegate void MessageHandler(string message);

public partial class SenderUserControl : System.Web.UI.UserControl
{
    public event MessageHandler SendMessage;

    protected void Button1_Click(object sender, EventArgs e)
    {
        SendMessage("test");
    }
}

ReceiverUserControl.ascx

public partial class ReceiverUserControl : System.Web.UI.UserControl
{
    public void ListnerMethod(string message)
    {

    }
}

感谢Mark Hall


2
如果两个用户控件都由同一个父级托管,则在父级中附加处理程序以订阅您想要订阅的用户控件事件,然后在处理程序中调用第二个用户控件中的方法。

有没有办法可以直接将用户控件与用户控件之间或主页面与用户控件之间或内容页面与主页面之间进行连接? - user2279051
这是Asp.net还是Winforms? - Mark Hall
1
我主要在Winforms或Wpf中工作,你可以尝试类似这样的代码来查看它是否有效。userControl1.SendMessage += new UserControl1.MyDelegate(userControl2.ListenerMethod); 这只是将Listener方法添加为事件处理程序。确保该方法具有与委托相同的返回类型。 - Mark Hall
@user2279051 我刚在一个ASP.Net项目上测试了一下,它也可以工作。 - Mark Hall
1
一个UserControl拥有另一个UserControl的知识并不好,我在它们所托管的页面的Page_Load事件中实现了这一点。您需要使用UserControl的实例名称。 - Mark Hall
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接