我有一个form1.cs,并以这种forms我有一个panel1,在form1.cs的加载事件中,我将一个控件添加到panel1。 现在我的问题是,我有一个名为Numbers.cs的控件,我需要添加另一个控件到该面板1,但从一个button事件的控制。 我怎样才能做到这一点?
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实例化欢迎,并将其添加到Form1.cs的窗体加载上的Panel1上。 然后,Welcome.cs有一个button,当我点击这个button,我需要交换到Numbers.cs。 但是我不知道如何从Welcome.cs做到这一点
另一种方法是使用由Numbers提出并由Form1处理的自定义事件来传递控件并将其添加到Panel的控件集合中。
这是添加到UserControl 1自定义事件的一个示例
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()); } }
注意:
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);
内部欢迎您需要创建事件处理程序,它可以是静态的或实例的一部分:
public event WelcomeClick OnClick;
在Button Click事件中,您可以使用相同的参数调用该事件:
if (OnClick != null) OnClick(sender, e);