如何从另一个类访问WinForm控件,例如ProgressBar
属性?
请参阅下面的代码。我知道这可能不是将WinForm类及其成员公开为public
的最佳选择,但我现在试图清除这个概念。
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)??
}
}
}
}
答案 0 :(得分:3)
您不希望您的业务逻辑(您的类)与您的UI(您的表单)进行交互。业务逻辑应该与表示层无关。
如果您希望表单响应类中发生的事情,您可以考虑在表单可以订阅的类中公开 Event ,就像订阅它一样按钮的点击事件。类实例可以完全不知道谁可能正在监听事件,并且会通知任何订阅者。
答案 1 :(得分:1)
这看起来像一个很大的时间代码气味:)。
您需要Class1内部的Form1实例才能PBUpdate
。
有些东西告诉我你在做什么是不对的。
解释你想要做什么,我们可以提供帮助。否则无法访问PBUpdate,除非您将其设置为静态函数,您可以将其称为Form1.PBUpdate()
,或者您的班级Form1
中有Class1
的实例
答案 2 :(得分:1)
您可以将进度条的访问修饰符从私有更改为内部或公共,您可以从属性窗格中执行此操作。
请记住,您必须将表单实例传递给第二个类,然后您可以直接从第二个类更改进度条的值。
然而,这是一个棘手的解决方案,最好的方法是保持表示层实现分离并使用事件。
答案 3 :(得分:0)
我不建议使用此方法,原因很简单,其中一条评论就是这里提到的。但是,如果您真的想要访问该表单控件,请按以下步骤操作:
1)选择该控件并将其访问修饰符设置为internal。 2)假设您的表单ID为“Form1”,控件ID为“control1”
在你的方法中:
Form1 form = (Form1)Application.OpenForms["Form1"];
// form.control1 should now be available.