C# 在C中使用来自单独类的控件#
我有一个程序,它在启动时动态创建控件,当代码在实际表单的类中时,它工作得很好。我尝试将代码移动到一个单独的类中,发现无法使用Controls.Add()。如何从单独的类向窗体添加控件?这就是我到目前为止所做的:C# 在C中使用来自单独类的控件#,c#,winforms,class,forms,controls,C#,Winforms,Class,Forms,Controls,我有一个程序,它在启动时动态创建控件,当代码在实际表单的类中时,它工作得很好。我尝试将代码移动到一个单独的类中,发现无法使用Controls.Add()。如何从单独的类向窗体添加控件?这就是我到目前为止所做的: TextBox txtbx = new TextBox(); txtbx.Text = "asd" + x.ToString(); txtbx.Name = "txtbx" + x.ToString();
TextBox txtbx = new TextBox();
txtbx.Text = "asd" + x.ToString();
txtbx.Name = "txtbx" + x.ToString();
txtbx.Location = new Point(10, (20 * x));
txtbx.Height = 20;
txtbx.Width = 50;
Controls.Add(txtbx);
错误1当前上下文中不存在名称“Controls”您至少需要对表单的引用。在Program.cs类中,可以存储对主窗体的引用,如:
public class Program {
public static Form MainForm;
public static void Main() {
...
MainForm = new Form1();
Application.Run(MainForm);
}
}
然后,要将控件添加到主窗体,可以执行以下操作:
Program.MainForm.Controls.Add(txtbx);
当然,这也带来了一个与类紧密耦合的问题,但从这个问题来看,您似乎是Windows窗体或.NET的新手,因此现在讨论这个问题毫无意义。您至少需要一个对窗体的引用。在Program.cs类中,可以存储对主窗体的引用,如:
public class Program {
public static Form MainForm;
public static void Main() {
...
MainForm = new Form1();
Application.Run(MainForm);
}
}
然后,要将控件添加到主窗体,可以执行以下操作:
Program.MainForm.Controls.Add(txtbx);
当然,这会带来另一个问题,即以这种方式紧密耦合类,但从这个问题来看,您似乎是Windows窗体或.NET的新手,因此现在没有必要再讨论这个问题。实际上是控件
类公开的属性(因此是表单
类,因为它继承自控件
),它表示已添加到表单类的特定实例的所有控件的集合
这就是为什么不能从另一个类中使用它,因为您没有对要在另一个类中添加控件的表单
对象的引用。这就是“在当前上下文中不存在”的意思
您需要将要添加控件的窗体的实例作为参数传递给将添加控件的类中的方法:
public void AddControls(Form frm)
{
TextBox txtbx = new TextBox();
txtbx.Text = "asd" + x.ToString();
txtbx.Name = "txtbx" + x.ToString();
txtbx.Location = new Point(10, (20 * x));
txtbx.Height = 20;
txtbx.Width = 50;
frm.Controls.Add(txtbx);
}
但是,如果您被迫这样做,您可能应该重新考虑应用程序的设计。您确实不应该从单独的类向窗体添加控件,因为这会增加UI和辅助类之间的耦合量,您应该尽可能将其最小化。通常,大多数当您发现某件事情特别难以完成时,这会发出一个危险信号,表明您可能试图以错误的方式完成它。实际上是控件
类公开的属性(因此表单
类继承自控件
),它表示已添加到表单类的特定实例的所有控件的集合
这就是为什么不能从另一个类中使用它,因为您没有对要在另一个类中添加控件的表单
对象的引用。这就是“在当前上下文中不存在”的意思
您需要将要添加控件的窗体的实例作为参数传递给将添加控件的类中的方法:
public void AddControls(Form frm)
{
TextBox txtbx = new TextBox();
txtbx.Text = "asd" + x.ToString();
txtbx.Name = "txtbx" + x.ToString();
txtbx.Location = new Point(10, (20 * x));
txtbx.Height = 20;
txtbx.Width = 50;
frm.Controls.Add(txtbx);
}
但是,如果您被迫这样做,您可能应该重新考虑应用程序的设计。您确实不应该从单独的类向窗体添加控件,因为这会增加UI和辅助类之间的耦合量,您应该尽可能将其最小化。通常,大多数当你发现某件事特别难做时,这会发出一个危险信号,表明你可能试图以错误的方式去做