c#从另一个类访问WinForm控件属性

如何从另一个类访问WinForm控件,如ProgressBar属性?

请参阅下面的代码。 我知道这可能不是将WinForm类及其成员publicpublic的最佳选择,但我正试图在此时清除这个概念。

 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void button1_Click(object sender, EventArgs e) { Class1 c = new Class1(); c.loop(); } public void PBSetup() { progressBar1.Minimum = 0; progressBar1.Maximum = 100; } public void PBUpdate(int recno) { progressBar1.Value = Class1.recno; } } } namespace WindowsFormsApplication1 { class Class1 { public static int recno; public void loop() { //How do I access Form1.PBSetup()?? for (recno = 0; recno <= 100; recno++) { //How do I access Form1.PBUpdate(recno)?? } } } } 

您不希望您的业务逻辑(您的类)与您的UI(您的表单)进行交互。 业务逻辑应该与表示层无关。

如果您希望表单响应类中发生的事情,您可以考虑在表单可以订阅的类中公开一个Event ,就像它会订阅按钮的click事件一样。 类实例可以完全不知道谁可能正在监听事件,并且将通知任何订阅者。

这看起来像一个很大的时间代码气味:)。 您需要在Class1内部使用Form1的实例才能进行PBUpdate 。 有些东西告诉我你在做什么是不对的。

解释你想要做什么,我们可以提供帮助。 否则无法访问PBUpdate,除非您将其设置为静态函数,您可以像Form1.PBUpdate()那样调用它,或者在类Class1有一个Form1实例

您可以将进度条的访问修饰符从私有更改为内部或公共,您可以从属性窗格中执行此操作。

属性窗格

请记住,您必须将表单实例传递给第二个类,然后您可以直接从第二个类更改进度条的值。

然而,这是一个棘手的解决方案,最好的方法是保持表示层实现分离并使用事件。

我不建议使用这种方法,原因很简单,其中一条评论就是这里提到的。 但是,如果您真的想要访问该表单控件,请按以下步骤操作:

1)选择该控件并将其访问修饰符设置为internal。 2)假设您的表单ID为“Form1”,控件ID为“control1”

在你的方法里面:

 Form1 form = (Form1)Application.OpenForms["Form1"]; // form.control1 should now be available.