1

我有多表单应用程序,我需要一个MyClass()实例可以从每个表单访问。我应该把它放在哪里?

将其公开给 form1,然后以其他形式使用 Form1.MyClassInstance或者最好的方法是什么?

4

1 回答 1

1

您可以将要共享的对象声明为静态字段:

public partial class Form1 : Form
{
    public static object MyObject;
    //...
}

...或将其声明为静态属性:

public partial class Form1 : Form
{
    private static object obj;
    public static object MyObject
    {
        get { return obj; } // read-only
    }
    //...
}

...然后你像这样访问它(在其他类中):

object obj = Form1.MyObject;

但是,如果您有多个 Form1 实例,则 MyObject 对于 Form1 的所有实例都是相同的。


另一种方法是通过调用Form.Show()设置Form.Owner属性:

public partial class Form1 : Form
{
    public object MyObject; // no static required
    public Form1()
    {
        InitializeComponent();
        Form2 f2 = new Form2();
        f2.Show(this); // this sets the Form.Owner property on f2
    }
    //...
}

...然后你像这样访问它(在 Form2 中):

Form1 f1 = (Form1)this.Owner;
object o = f1.MyObject;

这里的优点是您现在可以访问 Form1 的所有公共成员,即使它们没有被声明为静态的。但是如果你最小化/关闭 Form1,Form2 也会被最小化/关闭。


如果不想使用 static 或 Form.Owner,也可以将 Form1 实例的引用作为参数传递。例如,在 Form2 中,您可以编写一个以 Form1 作为参数的构造函数:

public partial class Form2 : Form
{
    public Form2(Form1 f1)
    {
        InitializeComponent();
        object o = f1.MyObject; // access MyObject like this
    }
    //...
}

...并像这样实例化 Form2(在 Form1 中):

Form2 f2 = new Form2(this);
于 2012-12-18T08:32:57.183 回答