2016-07-31 29 views
1

私には同様の質問がたくさんあります。しかし、私はC#には本当に新しいので、これを解決する方法を理解することはできません。子フォームが閉じられた後にDataGridViewを更新します。

メインフォームにDataGridViewがあります。新しいレコードを追加するダイアログボックスがあります。ですから、私が望むのは、ダイアログボックスを閉じるときにメインフォームのDataGridViewをリロード/リフレッシュすることです。 (ダイアログボックスでボタンを保存し、ボタンを押してください)。私は子フォームを開くには、このコードを使用し

public void UpdateProductsList() 
{ 
    String query = "SELECT * FROM product"; 
    con = new SqlConnection(conString); 
    con.Open(); 
    SqlDataAdapter sda = new SqlDataAdapter(query, con);  
    DataTable dt = new DataTable(); 
    sda.Fill(dt); 
    dataGridView1.DataSource = dt; 
} 

private void AddProductButton_Click(object sender, EventArgs e) 
{ 
    Add_product obj = new Add_product(); 
    obj.ShowDialog(); 
} 

だから、私はこの方法を使用してデータをロードし、このようなメインフォーム、上のパブリックメソッドを持っていますSaveボタンをクリックすると、子フォームでこのメソッドを呼び出します。

private void SaveProductButton_Click(object sender, EventArgs e) 
{ 
    SaveProduct(); 
    Products products = new Products(); 
    products.UpdateProductsList(); 
} 

ただし、[保存]ボタンをクリックしても機能しません。奇妙なことは、このメソッドをメインフォームのローカルボタンに追加すると、問題なく動作するということです。

また、MessageBox~UpdateProductsListを追加しましたが、データがデータベースに挿入されたと確信していますが、DataGridViewには新しいレコードが表示されません。

だからどこが間違っていたのですか?

+0

なぜ、新しいフォーム "Products = new Products();"を作成したいのですか? ?既存のメインフォームの参照をダイアログボックスに送信するだけです。 –

+0

あなたは私にそれをする方法を教えてもらえますか?私はこのOOPとC#でちょっと新しいです。 – TharinduLucky

+0

子フォームを作成して表示するコードを教えてください。 –

答えて

1

ヨーヨーが子フォームからLoadDataを呼び出す必要はありません、代わりにShowDialogの結果を確認し、それがDialogResult.OKだった場合は、メソッドを呼び出すことができます。

また、子供のフォームでは、データを保存した後に保存ボタンにthis.DialogResult = DialogResult.OKと設定します。子フォームで

ショー子フォーム

using (var f = new ChildForm()) 
{ 
    if(f.ShowDialog()== System.Windows.Forms.DialogResult.OK) 
     this.LoadData(); /*Load data in list form*/ 
} 

保存]ボタン

this.SaveData(); /*Save Data in child form */ 
this.DialogResult = System.Windows.Forms.DialogResult.OK; 

  • ときShowDialogが呼び出された場合、その後のコードはダイアログが閉じられるまで実行されません。
  • ShowDialogを使用してフォームを表示する場合、DialogResultプロパティをFormに設定すると、フォームが閉じます。
  • 保存ボタンにDialogResultOKを設定し、キャンセルボタンでCancelに設定することができます。
  • 現在、問題は保存ボタンのコードにあり、リストフォームの新しいインスタンスが作成され、UpdateProductsListメソッドが呼び出されました。あなたが見ることができるあなたのリストフォームのオープンインスタンスには何の影響もありません。それは違う。
+0

ありがとう!これは問題を解決しました。そしてサイドノートのおかげで!混乱の問題を修正しました。 :) – TharinduLucky

1

これは単なるサンプル、あなたは子フォームからメインフォームでのパブリックメソッドを呼び出す方法:あなたがShowDialogを使用して、子フォームを表示する場合

public class Products : Form 
{ 
    public void UpdateProductList() 
    { 
     // do something here 
    } 

    private void buttonOpenChildFormClick(object sender, EventArgs e) 
    { 
     using (var addProduct = new Add_product(this)) //send this reference of MainForm to ChildForm 
     { 
      addProduct.ShowDialog(); 
     } 
    } 
} 

public class Add_product : Form 
{ 
    private readonly Products _products; 

    public Add_product(Products products) //send reference of MainForm to ChildForm 
    { 
     _products = products; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _products.UpdateProductList(); 
    } 
} 
+0

私はこれをしましたが、オブジェクト参照はオブジェクトのインスタンスに設定されていません。 – TharinduLucky

+0

どこですか?どの行?あなたの場合、この行に "this"を追加する必要があります: "Add_product obj = new Add_product(this);" –

+0

ありがとう! Rezaの答えはそれを解決する! :) – TharinduLucky

関連する問題