wake-up-neo.net

Wie aktualisiere ich die Datagrid-Ansicht, wenn ich ein untergeordnetes Formular schließe?

Ich habe ein Dgv auf meinem Hauptformular, es gibt eine Schaltfläche, die ein anderes Formular öffnet, um einige Daten in die Datenquelle einzufügen, die an das Dgv gebunden ist. Ich möchte, dass beim Schließen des untergeordneten Formulars die automatische Aktualisierung von dgv beendet wird. Ich habe versucht, dieses Abschlussereignis in untergeordneter Form hinzuzufügen, es wird jedoch nicht aktualisiert:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
        {
            frmMain frmm = new frmMain();

            frmm.itemCategoryBindingSource.EndEdit();
            frmm.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
            frmm.dataGridView1.Refresh();
        }

Wenn ich diesen Code jedoch in eine Schaltfläche im übergeordneten Formular einfüge, wird der folgende Trick ausgeführt:

        this.itemCategoryBindingSource.EndEdit();
        this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
        this.dataGridView1.Refresh();
21
DanSogaard

Es gibt viele Möglichkeiten, dies zu tun, aber das Folgende ist am einfachsten und wird tun, was Sie wollen, und Sie können loslegen.

  • Erstellen Sie eine öffentliche Methode in Ihrem Hauptformular.
  • Konstruktor des zweiten Formulars geändert, um ein Hauptformular anzunehmen.
  • Erstellen Sie eine Instanz des zweiten Formulars, indem Sie das Hauptformularobjekt übergeben.
  • Rufen Sie beim Schließen des zweiten Formulars die öffentliche Methode des Hauptformularobjekts auf.

Form 1

public partial class Form1 : Form {
    public Form1() {
        //'add a label and a buttom to form
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e) {
        Form2 oForm = new Form2(this);
        oForm.Show();
    }
    public void PerformRefresh() {
        this.label1.Text = DateTime.Now.ToLongTimeString();
    }
}

Form2

public class Form2 : Form {
    Form1 _owner;
    public Form2(Form1 owner) {
        _owner = owner;
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
    }
    private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
        _owner.PerformRefresh();
    }
}
38
AMissico

Sie erstellen eine neue Instanz des Hauptformulars, die sich nicht auf die eigentliche Hauptformularinstanz auswirkt. Was Sie tun müssen, ist, den Code auf dem Hauptformular selbst aufzurufen, genauso wie der Code, den Sie beim Klicken auf die Schaltfläche als wirksam erachten:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
{
    this.itemCategoryBindingSource.EndEdit();
    this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
    this.dataGridView1.Refresh();
}
0
BFree

Tolle Antwort dort! Die andere Methode wäre gewesen:

  1. Prüfen Sie, ob das zu aktualisierende Formular geöffnet ist.
  2. Rufen Sie die Methode auf, um Ihre gridVieW zu aktualisieren.

    ** in Ihrem refreshMethod() in form1 stellen Sie sicher, dass Sie die datasource auf null setzen. **

 if (System.Windows.Forms.Application.OpenForms["Form1"]!=null)
            {
                (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).refreshGridView("");
            }

0
David Njuguna

Wir können auch so vorgehen:

Wir haben form_1 und form_2

  1. Erstellen Sie in Form_1 eine öffentliche Methode. In diese öffentliche Methode stecken wir unsere Sachen;
  2. In form_2 erstellen wir eine globale Formularvariable.
  3. Übergeben Sie in form_2 noch form_1 an form_2 durch den form_2-Konstruktor.
  4. Wenn Sie sich noch in form_2 befinden, erhalten Sie für Ihre globale Variable (die, die wir in Schritt 2 erstellt haben) die neue Instanz von form_1, die wir im form_2-Konstruktor erstellt haben.
  5. Innerhalb der closed_event-Methode rufen wir die Methode auf, die unser Zeug enthält.

Die Methode in unserem Material ist die Methode, die unsere Liste form1, dataGridView, comboBox oder was immer wir wollen, ausfüllt.

Form 1:

public fillComboBox()//Step 1. This is the method with your stuff in Form1
{
     foreach(var item in collection myInfo)
     {myComboBox.Items.Add(item)}

}

Form_2:

Form1 instanceForm1;//Step 2
public Form2(Form1 theTransporter)//Step 3. This the Form2 contructor. 
{ 
    InitializeComponent();
    instanceForm1 = theTransporter;//Step 4
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    instanceForm1.fillComboBox();//Step 5 we call the method to execute the task updating the form1
}

Ich hoffe, es hilft...