在多个表单之间共享对象实例

时间:2012-12-18 08:05:12

标签: .net winforms

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

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

1 个答案:

答案 0 :(得分:1)

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

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实例,则对于Form1的所有实例,MyObject将是相同的。


另一种方法是通过调用Form.Owner

来设置Form.Show()属性
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);
相关问题