1

マルチフォーム アプリケーションがあり、各フォームからMyClass()の 1 つのインスタンスにアクセスできるようにする必要があります。どこに置けばいいですか?

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 のすべてのインスタンスで同じになります。


もう 1 つの方法は、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 に答える