から開くセカンダリ フォームから、メイン フォームのプロパティまたはオブジェクトのプロパティにアクセスできませんForm1
。
この問題を解決する簡単な方法はありますか?
私はネットでいくつかの役に立たない解決策を見つけました。
のプロパティForm1
を public に設定しますが、これは OOP ルールに違反することに注意してください
MainForm で 1 つ以上のパブリック プロパティを設定します。2 番目のフォームを開くときに、そのフォームの所有者を MainForm に設定します。このようにして、2 番目のフォームで MainForm のプロパティにアクセスできます。コード例:
コード ビハインド Form1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public String SomeProperty { get; set; }
//Event of a normal button with name 'OpenFormButton'
private void OpenFormButton_Click(object sender, EventArgs e)
{
var secondForm = new Form2
{
Owner = this
};
secondForm.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
SomeProperty = "HELLO WORLD";
}
}
コード ビハインド Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
var owner = this.Owner as Form1;
var val = owner.SomeProperty;
MessageBox.Show(val); //Shows a MessageBox with 'HELLO WORLD'
}
}
これは、別のフォームのプロパティにアクセスする方法を示す単純なコードです。プロパティの値を取得するだけでなく、プロパティの値を設定 (変更) することもできます。これは、文字列や整数の代わりに複雑な型にも当てはまります。お役に立てれば!
次のような単純な Callback 関数を使用することをお勧めします。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public String SomeProperty { get; set; }
private void OpenFormButton_Click(object sender, EventArgs e)
{
var secondForm = new Form2()
{
GetSomeProperty = () => { return SomeProperty ;};
};
secondForm.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
SomeProperty = "HELLO WORLD";
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public Func<string> GetSomeProperty
{
get;
set;
}
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show(GetSomeProperty.Invoke());
}
}
GetSomeProperty.Invoke(); を呼び出すたびに。Func は get アクセサーを呼び出し、最初の Form から返します
Form1 のインスタンスを Form2 コンストラクターに渡す必要があります