2016-07-31 11 views
1

Ich weiß, viele ähnliche Fragen sind da draußen. Aber ich bin wirklich neu in C#, also kann ich nicht herausfinden, wie ich das lösen soll.Update DataGridView nach Child Formular geschlossen

Ich habe eine DataGridView auf Hauptformular und ich habe ein Dialogfeld zum Hinzufügen neuer Datensätze. Also, was ich will, ist das Neuladen/Aktualisieren der DataGridView auf Hauptformular, wenn das Dialogfeld geschlossen wird. (Drücken Sie Speichern Sie Schaltfläche im Dialogfeld).

Also, ich habe eine öffentliche Methode auf der Hauptform wie diese, die ich Daten mit dieser Methode zu laden:

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; 
} 

ich diesen Code verwenden, um das Kind Formular zu öffnen:

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

Jetzt rufe ich diese Methode im Child-Formular auf, wenn auf die Schaltfläche Speichern geklickt wird.

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

Dies ist jedoch nicht möglich, wenn die Speicher-Schaltfläche geklickt wird. Seltsam ist, wenn ich diese Methode zu einer lokalen Schaltfläche auf dem Hauptformular hinzufüge, funktioniert es ohne ein Problem.

Ich fügte auch eine MessageBox zu UpdateProductsList hinzu und ich bin mir sicher, dass es aufgerufen wurde, auch die Daten wurden in die Datenbank eingefügt, aber die DataGridView zeigt keinen neuen Datensatz.

Also, wo bin ich falsch gelaufen? Diese

+0

Warum möchten Sie ein neues Formular erstellen "Products products = new Products();" ? Senden Sie einfach den Verweis des vorhandenen Hauptformulars an das Dialogfeld. –

+0

Kannst du mir einfach den Weg zeigen? Ich bin ein wenig neu zu diesem OOP und C# – TharinduLucky

+0

Zeigen Sie uns den Code, wo Sie das untergeordnete Formular erstellen und anzeigen. –

Antwort

1

Wenn Sie das Kind Form zeigen mit ShowDialog yo nicht LoadData von Kind Form aufrufen müssen, Stattdessen können Sie das Ergebnis von ShowDialog überprüfen, und wenn es DialogResult.OK war, rufen Sie die Methode auf.

Auch in Ihrem Kindformular, in Ihrer Speichern-Taste nach dem Speichern von Daten, setzen Sie this.DialogResult = DialogResult.OK.

anzeigen Child Form

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

Schaltfläche Speichern Child Form

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

Hinweis

  • Wenn ShowDialog wird aufgerufen, der nachfolgende Code wird erst nach dem Schließen des Dialogs ausgeführt.
  • Wenn Sie ein Formular mit ShowDialog anzeigen, wird DialogResult Eigenschaft von Form das Formular geschlossen.
  • Sie können DialogResult zu OK in Ihrem Speichern-Button und setzen Sie es auf Cancel in Ihrem Abbrechen-Taste.
  • Momentan liegt Ihr Problem im Code Ihrer Schaltfläche zum Speichern, Sie haben eine neue Instanz Ihres Listenformulars erstellt und die Methode UpdateProductsList aufgerufen.Es hat keine Auswirkungen auf die offene Instanz Ihres Listenformulars, das Sie sehen können. Es ist eine andere Idee.
+0

Danke! Dies hat das Problem gelöst. Und danke für die Randnotizen! Es wurden viele Verwirrungen behoben. :) – TharinduLucky

1

ist nur ein Beispiel, wie Sie die öffentliche Methode in Hauptform von Kind Form:

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

Ich tat dies, aber es sagt 'Objektreferenz nicht auf eine Instanz eines Objekts gesetzt. – TharinduLucky

+0

wo? welche Linie ? In Ihrem Fall müssen Sie dieser Zeile "this" hinzufügen: "Add_product obj = new Add_product (this);" –

+0

Danke! Rezas Antwort löst es! :) – TharinduLucky