【问题标题】:How to add a control to a panel on a form from another user control如何从另一个用户控件将控件添加到窗体上的面板
【发布时间】:2012-03-23 23:38:10
【问题描述】:

我有一个 form1.cs,在那个表单中我有一个 panel1,在 form1.cs 的加载事件中,我正在向 panel1 添加一个控件。现在我的问题是,我有一个名为 Numbers.cs 的控件,我需要在该 panel1 中添加另一个控件,但要在按钮事件中从该控件中添加。我该怎么做?

public partial class Number : UserControl
{
    public Number()
    {
        InitializeComponent();
    }

    private void btnAcceptWelcome_Click(object sender, EventArgs e)
    {
          //HERE I NEED TO PASS A CONTROL TO THE PANEL1 IN FORM1.CS
          //NOT SURE HOW TO DO THIS.
    }
}

更多信息

所以基本上我有一个名为 UserControls 的文件夹,在那个文件夹中我有

Numbers.cs
Letters.cs
Welcome.cs

所有这些都是用户控件,然后我有一个表单

Form1.cs

Form1.cs 实例化 Welcome,并在表单加载时添加到 Form1.cs 上的 Panel1。然后 Welcome.cs 有一个按钮,当我单击此按钮时,我需要切换到 Numbers.cs。但我不知道如何从 Welcome.cs 执行此操作

【问题讨论】:

  • Numbers.cs 是否托管在 Form1 中,添加到您的面板中的控件是否是在 Numbers.cs 或 Form1 中创建的
  • 我拥有它的方式是我有一个表单 form1.cs,然后在一个文件夹中我正在创建用户控件,但有时.. 其中一个用户控件需要向 form1 添加不同的用户控件.cs.. 很难解释。
  • 虽然有重复的响应,但没有比下面显示的更清洁的方法了,因此我认为这对于需要学习正确方法的人来说是一个更好的答案。

标签: c# windows


【解决方案1】:

另一种方法是使用由 Numbers 引发并由 Form1 处理的Custom Event 来传递控件并将其添加到面板的控件集合中。


这是添加到 UserControl1 的自定义事件的示例

Form1

public partial class Form1 : Form
{
    UserControl2 mySecondControl = new UserControl2();
    public Form1()
    {
        InitializeComponent();
        userControl11.AddControl+=new EventHandler(SwapControls);

    }

    private void SwapControls(object sender, EventArgs e)
    {
        panel1.Controls.Remove(userControl11);
        userControl11.AddControl -= new EventHandler(SwapControls);
        panel1.Controls.Add(mySecondControl);
    }
}

用户控制

public partial class UserControl1 : UserControl
{
    public event EventHandler AddControl;
    public UserControl1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.AddControl(this, new EventArgs());
    }
}

【讨论】:

  • 要求一个小例子会不会太过分了..我是 Windows 窗体中的婴儿程序员。
  • @user710502 你需要交换用户控件还是添加额外的
  • 我要清除当前表格上的一个并放入新的。我在 form1.cs 中有一个 Panel1,我在其中放置控件
  • @IAbstract 您可能已经注意到我删除了有问题的代码并添加了使用我的第一个语句的代码。当听起来第一个用户控件正在创建第二个时,我只放了第一个选项。我将从我的答案中完全删除代码。
  • 为什么这个 userControl11.AddControl+=new EventHandler(SwapControls);非静态字段、方法或属性需要给我一个对象引用吗?
【解决方案2】:

注意:

  1. 未经测试的代码
  2. 假设 Form1 有(或可以获得)Number 的引用

Number添加一个事件处理程序:

public partial class Number : UserControl
{
    //  event handler Form1 will subscribe to
    public EventHandler<EventArgs> OnWelcomeAccepted = (o, e) => { };

    public Number()
    {
        InitializeComponent();
    }

    private void btnAcceptWelcome_Click(object sender, EventArgs e)
    {
          //  raise the event
          OnWelcomeAccepted(sender, e);
    }
}

...Form1 将有订阅之后 InitializeComponent();请注意对ControlAdded 的额外订阅:

public partial class Form1 : Form {
    public Form1()
    {
        InitializeComponent();

        this.ControlAdded += Control_Added;
        //  subscribe to the event and provide the implementation
        Number.OnWelcomAccepted += (o, e) => { Controls.Add(GetControl( )); }
    }

    private void Control_Added(object sender, System.Windows.Forms.ControlEventArgs e)
    {
        //  process size and placement and show
    }

}

任何其他控件都不应直接向Form1 添加任何内容。让 Form1 控制它的孩子。

【讨论】:

    【解决方案3】:

    一种方法是在数字中引用 panel1,因为它们都是在 form1 中创建的,您可以将其中一个作为参数传递给另一个的构造函数。

    【讨论】:

    • 如何在 Numbers.cs 中引用此类面板。我有一个名为 UserControls 的文件夹,其中我现在有三个用户控件。但其中一个需要更改 form1.cs 中的 panel1 的内容(切换到另一个用户控件)。
    • 你提出的责任链只会使调试和维护复杂化。
    【解决方案4】:

    你的描述不是很清楚,但你可以在构造函数或属性中传递你想要的控件。由于在 C# 中对象始终是通过引用,因此您将在 Button 事件中对同一控件进行操作。您始终可以编写自己的事件并让面板注册它。更完整的代码示例会很棒。

    我仍然有点不确定你在做什么,但没关系。我认为最灵活的方法是创建自己的自定义事件。在任何类之外创建一个委托:

    public delegate void WelcomeClick(object sender, EventArgs e);
    

    在 Welcome 中,您需要创建事件处理程序,它可以是静态的,也可以是实例的一部分:

    public event WelcomeClick OnClick;
    

    在 Welcome 中的 Button Click 事件中,您可以使用相同的参数调用该事件:

    if (OnClick != null)
                    OnClick(sender, e);
    

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 2016-08-15
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多