C# 如何让表单订阅 floy 布局面板中用户控件内的事件?

C# How to have a form subscribe to an event which is within a user control within a floy layour panel?

所以我在 WinForms 应用程序上有一个表单。 该窗体上有一个 FlowLayoutPanel。 FlowLayout 面板上有一堆用户控件,每个控件代表来自数据库 table 的行。 每个控件上都有一个按钮。

如何让表单订阅一个按钮,点击其中一个控件传回行数据库信息?

这是控制代码:

public partial class ctrlLeague : UserControl
{
    public League activeLeague = new League();
    public event EventHandler<MyEventArgs> ViewLeagueClicked;
    public ctrlLeague(League lg)
    {
        InitializeComponent();
        lblLeagueName.Text = lg.leagueName;
        activeLeague = lg;
    }

    private void btnViewLeague_Click(object sender, EventArgs e)
    {
        ViewLeagueClicked(this, new MyEventArgs(activeLeague));
    }

    public class MyEventArgs : EventArgs
    {
        public MyEventArgs(League activeLeague)
        {
            ActiveLeague = activeLeague;
        }
        public League ActiveLeague { get; }
    }
}

如果我将以下内容放入表单构造函数中,它会告诉我“

你可以用delegate定义你最喜欢的事件,然后在任何你想调用的地方调用它,这里是在btnView_Click.

里面调用

This means that whenever btnView_Click called, your event is actually called.

public partial class ctrlLeague : UserControl
{
    public League activeLeague = new League();
    public event EventViewLeagueClicked ViewLeagueClicked;
    public delegate void EventViewLeagueClicked(object Sender);


    public ctrlLeague(League lg)
    {
       InitializeComponent();
       lblLeagueName.Text = lg.leagueName;
       activeLeague = lg;
    }

    private void btnViewLeague_Click(object sender, EventArgs e)
    {
       if (ViewLeagueClicked != null)
         ViewLeagueClicked(activeLeague);
    }
}

现在使用

public Form1()
{
    InitializeComponent();
    League league = new League();
    league.leagueName = "Seri A";
    
    
    //
    //These lines are best added in Form1.Designer.cs
    //
    ctrlLeague control = new ctrlLeague(league);
    control.Location = new System.Drawing.Point(350, 50);
    control.Name = "ctrlLeague";
    control.Size = new System.Drawing.Size(150, 100);
    control.ViewLeagueClicked += Control_ViewLeagueClicked;
    this.Controls.Add(control);
}
private void Control_ViewLeagueClicked(object Sender)
{
   League l = Sender as League;
   MessageBox.Show(l.leagueName);
}