0

こんにちは、私の機能を次のようにコーディングしました。私のフォーム 1 には、いくつかのテキスト ボックスとデータ グリッド ビューがあり、ユーザーがデータ グリッド ビューの編集をクリックするとフォーム 2 がポップアップとして表示され、ユーザーが変更を加えると変更が更新され、これは私のコードです

// Form1 コード

    public void UpDateData(DataTable dt)
   {
     dataGridView1.Refresh();
     dataGridView1.DataSource = dt;
     updateTextBoxes();
   }
    public void updateTextBoxes()
    {
      //  Some caluculation based on the datagridview rows
    }

Form2 ボタンクリックコード

private void button1_Click(object sender, EventArgs e)
{
   // Some code to collect the changes made
   Form1 f=new Form1();
   f.UpDateData(dt);
   this.close();
 }

必要に応じてテキストボックスを更新していないupdateTextBoxesメソッドを除いて、すべてが正常に機能します

4

2 に答える 2

2

次のコードを使用すると、問題が解決します

フォームの新しいインスタンスを作成しないでください。代わりに、呼び出し元フォームへの参照を作成し、呼び出し元フォームで UpdateData() メソッドを呼び出します。

  //Form1 f=new Form1();
   callingform.UpDateData(dt);
   this.close();
于 2013-06-24T10:54:43.443 に答える
2

元のインスタンスとは何の関係もない (おそらく同じデータが表示されていない) Form1 の新しいインスタンスを作成しているため、更新コードはこのフォーム インスタンス (途中で非表示) で動作し、元のインスタンス。

この問題を解決する最も簡単な方法は、Form1 のインスタンスを Form2 のコンストラクターに渡し、このインスタンスを Form2 内に保存し、この保存されたインスタンスを使用して更新を呼び出すことです。

form1.cs で

 Form2 f = new Form2(this);
 f.Show();

form2.cs で

Form1 _callingInstance;
public Form2(Form1 caller)
{
     _callingInstance = caller;
}

private void button1_Click(object sender, EventArgs e)
{
   _callingInstance.UpDateData(dt);
   this.Close();
 }

このInterForm Communicationの問題に対するもう少し良いアプローチは、カスタム イベントを作成して使用することです。このシナリオでは、Form2 は、変更が完了すると、その変更に関心のあるすべてのクライアントに、データを更新する必要があることを通知しようとします。Form1 は Form2 から発生したイベントをサブスクライブし、通知されるとそのデータを更新します..
2 つのフォーム間の結合が少ないため、このアプローチの方が優れていると考えられます。

form2.cs で

パブリック デリゲート void OnUpdateData(); 公開イベント OnUpdateData UpdateData;

private void button1_Click(object sender, EventArgs e)
{
   if(UpdateData != null) UpdateData();
   this.Close();
 }

form1.cs で

 Form2 f = new Form2();
 f.UpdateData += myCallbackUpdateMethod;


 public void myCallbackUpdateMethod()
 {
    DataTable dt = GetTable();
    UpDateData(dt)
 }
于 2013-06-24T10:51:58.107 に答える