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

时间:2011-11-01 19:53:25

标签: c#

如何从另一个类访问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)??
            }
        }
    }
}

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

解释你想要做什么,我们可以提供帮助。否则无法访问PBUpdate,除非您将其设置为静态函数,您可以将其称为Form1.PBUpdate(),或者您的班级Form1中有Class1的实例

答案 2 :(得分:1)

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

Properties pane

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

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

答案 3 :(得分:0)

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

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

在你的方法中:

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