如何从另一个用户控件将控件添加到窗体上的面板
本文关键字:控件 窗体 另一个 用户 添加 | 更新日期: 2023-09-27 18:28:47
我有一个form1.cs,在该表单中我有一块panel1,在form1.cs的加载事件中,我将向panel1添加一个控件。现在我的问题是,我有一个名为Numbers.cs的控件,我需要向该面板1添加另一个控件,但在按钮事件中从该控件添加。我该怎么做?
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引发并由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());
}
}
注意:
- 未测试的代码
- 假设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控制它的孩子。
一种方法是在数字中引用panel1,因为这两个数字都是在form1中创建的。您可以将其中一个作为参数传递给另一个的构造函数。
从您的描述中看不太清楚,但您可以在构造函数或属性中传递所需的控件。由于C#中的对象总是通过引用的,所以您将在Button事件中对同一控件执行操作。您可以随时编写自己的事件,并让面板为其注册。一个更完整的代码示例将非常好。
我仍然有点不确定你到底在做什么,但没关系。我认为最灵活的方法是创建自己的自定义活动。在任何类之外创建委托:
public delegate void WelcomeClick(object sender, EventArgs e);
在Welcome中,您需要创建事件处理程序,它可以是静态的,也可以是实例的一部分:
public event WelcomeClick OnClick;
在欢迎的按钮点击事件中,您可以使用相同的参数调用该事件:
if (OnClick != null)
OnClick(sender, e);