1

親フォーム:プロパティ:合計値の2つのフォームがあり ます。子フォームをロードするボタン。 子フォーム:プロパティ: 値を挿入します。

アプリケーションを実行すると、最初に親フォームがロードされました。ボタンをクリックして、2 番目の (子) フォームを読み込むことができます。問題は、子フォームに値を挿入すると、デリゲートやその他のメソッドで値を渡しても、親フォームに変更が表示されないことです。

親ウィンドウをリロードしたくありません。助けてください

4

3 に答える 3

0

あなたがしなければならないことは、子にイベントを作成し(または、既存のイベントを使用する場合はそれらを使用して)、親フォームにそれらのイベントをサブスクライブさせることです。

一般的な例の 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 または他のサイトに多くのチュートリアルがあります。それ(またはこのデザインの他の側面)に問題がある場合は、コメントで説明を求めてください.

于 2012-05-15T17:03:40.727 に答える
0

複数のフォーム間でデータの一貫性を保ちたい場合は、両方のフォームからアクセスできるオブジェクトにデータを配置することをお勧めします。

最も直接的な方法は、オブジェクトにINotifyPropertyChangedを実装することです。これにより、両方のフォームでこのオブジェクトにバインドでき、加えられた変更によってプロパティ変更イベントがトリガーされます。

INotifyPropertyChanged には、複雑なシナリオで必要な微妙な点が欠けている可能性があるため、より複雑なシナリオでは、サブスクライブできるカスタム イベントを持つオブジェクトを作成します。例として、すべての UI 要素がサブスクライブするプライマリ ナビゲーション フォーム用の「Helm」オブジェクトがあります。ナビゲーション イベントが発生すると、ヘルムがすべてのナビゲーションとデータの読み込みを行い、UI がリッスンする一連のイベントをトリガーします。

単純な親子の場合、これはやり過ぎのように思えるかもしれませんが、このモデル (UI が単純にサブスクライブする現在の状態に対して 1 つの真実がある) により、UI を進化させ、UI の各要素がそれ自体のニーズだけを心配することができます。

于 2012-05-15T17:04:54.517 に答える
0

子フォームに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);
于 2012-05-15T17:05:08.963 に答える