在另一个类中使用C#的winform控件

8

我有一个WinForm应用程序,在主窗体上有许多控件,如标签、文本框等。

如果我有另一个类,在同一个程序集中,我该如何访问这些控件?

例如,从我的新类中,我想要更新Form1中的一个标签?


1
以防万一:请确保您在同一个线程上执行此操作。 - smirkingman
你首先需要将Form1的引用传递给那个类。有了这样的引用,你就可以使用其他人建议的方法来公开属性。 - Shadow The Spring Wizard
扩展@smirkingman所说的,如果您将在跨线程调用这些方法,则需要使用Control.Invoke。 - cordialgerm
5个回答

17
在标签(或任何控件)的属性中,将“Modifiers”选项设置为“Public”。
现在,您可以从窗体对象访问该标签。
 Form1 f = new Form1()
 f.lblMyLabel.Text = "My Text"

4

一种方法是在Form1类中创建公共属性,以便公开要修改的控件。

例如,如果您的标签在设计时称为label1,则可以这样做:

public Label MyForm1Label { get { return label1; } }

4

选择您想要从另一个类/表单中访问的控件。转到其属性并将其修饰符值设置为“internal”(如果您只想在同一程序集中使用它)。

现在,无论在同一程序集中的哪个位置使用它,只需创建该表单的对象即可,例如:

myForm objform = new myForm();
objform.txtName.Text="any text";

然后,您可以使用objform.show();或objform.showdialog();来显示该表单。

但我认为这不会解决您的问题,因为我感觉您的表单已经显示在屏幕上,而您希望从另一个表单/类更改其标签/文本框的值。 因此,您需要获取当前表单的对象,否则它将不会显示在当前正在显示的表单上。

因此,我认为单例模式将为您提供完美的解决方案。只需创建一个类,在该类中创建该表单的静态对象,然后创建一个静态函数并检查对象是否已初始化,如果已初始化,则不要初始化它并使用现有对象,否则初始化它。

还有许多其他解决方案,例如通过创建公共属性,但您必须使用当前正在显示的表单的同一对象的引用才能看到更改反映在当前正在显示的表单中。


2
除了已经提到的解决方案,您可以为表单创建一些公共方法,以提供所需的功能(如果某些更改必须在多个控件中显示,则可能很好 - 您的其他类不必记住要更改哪个控件)。请注意保留 HTML 标签。
public void SetSomething(int value)
{
   Control1.value = value;
   Control2.value = value;
   ...
}

0

最简单的方法是使用:

Form1 f = new Form1() f.lblMyLabel.Text = "我的文本"

因此,您必须将Form1标签"lblMyLabel"设置为public。我已经用richTextBox完成了它。

输入图片描述


请适当格式化您的答案。 您的答案与已发布的答案完全相同。 - hellow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接