在C#中使用来自单独类的控件

时间:2011-01-12 05:44:28

标签: c# winforms class forms controls

我有一个程序在启动时动态创建控件,当执行此操作的代码在实际表单的类中时,它可以正常工作。我尝试将代码移动到一个单独的类,发现我无法使用Controls.Add()。如何从单独的类中向窗体添加控件?这就是我到目前为止所做的:

            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当前上下文中不存在名称“控件”

2 个答案:

答案 0 :(得分:3)

Controls实际上是Control类(因此它继承自Form)所暴露的属性,它代表了所有类的集合已添加到表单类的特定实例的控件。

这就是为什么你不能在另一个类中使用它的原因,因为你没有引用你试图在另一个类中添加控件的Control对象。这就是“在当前背景下不存在”的含义。

您需要将要添加控件的表单实例作为参数传递给将添加控件的类中的方法:

Form

但是如果你被迫进入这样的职位,你应该重新考虑你的应用程序的设计。您真的不应该从单独的类向表单添加控件,因为这会增加UI和辅助类之间的耦合量,您应该尽可能地将其最小化。一般来说,大多数时候你发现某些东西特别难以做到,这应该会发出一个红旗,你可能试图以错误的方式去做。

答案 1 :(得分:1)

至少需要对表单的引用。在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 Forms或.NET的新问题开始,所以暂时解决这个问题毫无意义。