如何将控件添加到另一个用户控件的窗体上的面板

时间:2012-03-23 23:38:11

标签: c# windows

我有一个form1.cs并且在那个表单中我有一个panel1,在form1.cs的load事件中我正在向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

这样做

4 个答案:

答案 0 :(得分:2)

另一种方法是使用Numbers引发的Custom Event并由Form1处理以传递控件并将其添加到Panel的Control Collection中。


这是添加到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());
    }
}

答案 1 :(得分:2)

注意:

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

    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控制它的孩子。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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

public event WelcomeClick OnClick;

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

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