親フォーム:プロパティ:合計値の2つのフォームがあり ます。子フォームをロードするボタン。 子フォーム:プロパティ: 値を挿入します。
アプリケーションを実行すると、最初に親フォームがロードされました。ボタンをクリックして、2 番目の (子) フォームを読み込むことができます。問題は、子フォームに値を挿入すると、デリゲートやその他のメソッドで値を渡しても、親フォームに変更が表示されないことです。
親ウィンドウをリロードしたくありません。助けてください
あなたがしなければならないことは、子にイベントを作成し(または、既存のイベントを使用する場合はそれらを使用して)、親フォームにそれらのイベントをサブスクライブさせることです。
一般的な例の 1 つは、親を非表示にして子を表示し、子が閉じられると再び表示することです。これを行うコードを次に示します。
//in parent form
private void someButtonClickHander(object sender, EventArgs args)
{
ChildForm child = new ChildForm();
this.Hide();
child.Closing += (sender2, args2) =>
{
var someResultFromChildForm = child.SomePropertyOnChildForm;
this.Show();
}
child.Show();
}
終了イベントが機能しない場合 (子フォームがボタンを押したときに何かを実行したい場合など)、子フォームに独自のイベントを作成させる必要がある場合があります。これを行う方法については、MSDN または他のサイトに多くのチュートリアルがあります。それ(またはこのデザインの他の側面)に問題がある場合は、コメントで説明を求めてください.
複数のフォーム間でデータの一貫性を保ちたい場合は、両方のフォームからアクセスできるオブジェクトにデータを配置することをお勧めします。
最も直接的な方法は、オブジェクトにINotifyPropertyChangedを実装することです。これにより、両方のフォームでこのオブジェクトにバインドでき、加えられた変更によってプロパティ変更イベントがトリガーされます。
INotifyPropertyChanged には、複雑なシナリオで必要な微妙な点が欠けている可能性があるため、より複雑なシナリオでは、サブスクライブできるカスタム イベントを持つオブジェクトを作成します。例として、すべての UI 要素がサブスクライブするプライマリ ナビゲーション フォーム用の「Helm」オブジェクトがあります。ナビゲーション イベントが発生すると、ヘルムがすべてのナビゲーションとデータの読み込みを行い、UI がリッスンする一連のイベントをトリガーします。
単純な親子の場合、これはやり過ぎのように思えるかもしれませんが、このモデル (UI が単純にサブスクライブする現在の状態に対して 1 つの真実がある) により、UI を進化させ、UI の各要素がそれ自体のニーズだけを心配することができます。
子フォームにParentというプロパティがあります。子のインスタンスを作成するときは、現在のオブジェクト (親フォーム オブジェクト) をコンストラクターに渡し、そこで子の Parent プロパティ値として設定します。親フォームで 親フォームにパブリック メソッドを用意します。P
親フォーム
Form1 : Form
{
decimal _totalPrice;
public void UpdateTotal(decimal val)
{
_totalPrice=_totalPrice+val;
lblTotal.Text=_totalPrice.ToString();
}
}
子フォーム
Form2:Form
{
public Form1 Parent { set;get;}
public Form2(Parent parent)
{
this.Parent =parent;
}
}
子フォームのオブジェクトを作成する場合
Form2 objChjild=new Child(this);
//do whatever
子フォームから、合計を更新する場合は、
このように呼び出します
this.Parent.UpdateTotal(200);