【问题标题】:C# How to have a form subscribe to an event which is within a user control within a floy layour panel?C#如何让表单订阅floy布局面板中用户控件内的事件?
【发布时间】:2021-02-05 18:44:04
【问题描述】:

所以我在 WinForms 应用程序上有一个表单。 在那个表单上是一个 FlowLayoutPanel。 FlowLayout 面板上有一堆用户控件,每个控件代表数据库表中的行。 每个控件上都有一个按钮。

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

这是控制代码:

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; }
    }
}

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

【问题讨论】:

  • 那么按钮在 ctrLeague 用户控件上?然后像往常一样订阅 evant (btn.Click += btnViewLeague_Click)。
  • 但是我的表单不能像其他事件一样看到这个事件。我认为这是因为它在一个控件内,在一个 FlowLayoutPanel 内,并且该控件有多个实例。
  • 我不知道您想在用户控件中订阅事件,而不是在表单中。
  • 如果不清楚,我深表歉意。

标签: c# winforms event-handling


【解决方案1】:

您可以使用委托定义您最喜欢的事件并在任何您想要的地方调用它,这里它在 btnView_Click 内部调用。

这意味着每当调用 btnView_Click 时,您的事件就是 实际调用。

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);
}

【讨论】:

  • 好的太好了,从表单中我现在可以看到 ctrlLeague.EventViewLeagueClicked。我如何以活动的形式利用它?抱歉,我是初学者。
  • 我在帖子里解释了,哪里看不懂,告诉我解释。
  • 抱歉,由于某种原因,我之前没有看到大部分信息,只有您发布的 ctrlLeague 代码。我现在都看到了。
  • 看准了!做梦。谢谢你。
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多