web-dev-qa-db-fra.com

Comment actualiser datagridview lors de la fermeture d'un formulaire enfant?

J'ai un dgv sur mon formulaire principal, il y a un bouton qui ouvre un autre formulaire pour insérer des données dans la source de données liée au dgv. Je veux quand le formulaire enfant ferme le rafraîchissement automatique de dgv. J'ai essayé d'ajouter ceci dans l'événement de clôture du formulaire enfant, mais cela ne rafraîchit pas:

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

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

Cependant, lorsque j'ajoute ce code dans un bouton du formulaire parent, le problème est résolu:

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

Il existe plusieurs façons de procéder, mais voici la plus simple. Elle fera ce que vous voulez et vous permettra de démarrer.

  • Créez une méthode publique sur votre formulaire principal.
  • Constructeur modifié de seconde forme pour prendre une forme principale.
  • Créez une instance du deuxième formulaire en transmettant l'objet de formulaire principal.
  • Lors de la fermeture du second formulaire, appelez la méthode publique de l'objet de formulaire principal.

Formulaire 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

Vous créez une nouvelle instance du formulaire principal qui n'affecte pas l'instance principale du formulaire. Ce que vous devez faire, c'est appeler le code sur le formulaire principal lui-même, tout comme le code que vous dites fonctionne sur le clic du bouton:

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

Super réponse là-bas! L'autre méthode aurait été:

  1. Vérifiez si le formulaire que vous souhaitez mettre à jour est ouvert.
  2. Appelez la méthode pour actualiser votre gridVieW.

    ** dans votre refreshMethod() dans form1 assurez-vous de régler datasource sur null **

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

0
David Njuguna

Nous pouvons aussi procéder de cette façon:

Nous avons formulaire_1 et formulaire_2

  1. Dans formulaire_1, créez une méthode publique. À l'intérieur de cette méthode publique, nous mettons nos affaires;
  2. Dans form_2, nous créons une variable de formulaire globale;
  3. Toujours dans le formulaire_2, transmettez le formulaire_1 au formulaire_2 via le constructeur de formulaire_2;
  4. Toujours dans form_2, indiquez à votre variable globale (celle créée à l'étape 2) la nouvelle instance form_1 créée dans le constructeur form_2;
  5. A l'intérieur de la méthode closing_event, nous appelons la méthode qui contient notre matériel.

La méthode avec nos données est la méthode qui remplira notre liste form1, dataGridView, comboBox ou ce que nous voulons.

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

J'espère que ça aide ...