-1
votes

Est-il préférable d'avoir une instance du nouveau formulaire lors de l'utilisation de ShowDialog ou d'en créer un à chaque fois que le formulaire est affiché? - C #

J'ai une application winform simple en c #. Il affiche des données sur le contrôle d'affichage de la grille de données, lorsque l'utilisateur double-clique sur la ligne, un autre formulaire (non MDI) s'affiche, indiquant la date associée sur le nouveau formulaire.

Le nouveau formulaire a une variable de type de table de données et une vue de grille de données en lecture seule, j'attribue une nouvelle source de données à la grille chaque fois que l'utilisateur clique sur la ligne de la grille (sur la fenêtre parent).

Est-il préférable de créer une nouvelle instance d'un formulaire au niveau de la classe et d'afficher le formulaire en utilisant show dialog Ou devrais-je utiliser l'instruction using chaque fois que l'utilisateur double-clique sur la ligne?

Méthode 1

void button1_OnClick(object sender, EventArgs e) {
      using (MyForm _form = new MyForm())
      {
        _form.ShowDialog(this);
       }

}

Méthode 2

MyForm _form = new MyForm();

void button1_OnClick(object sender, EventArgs e) {
    _form.ShowDialog(this);
}


3 commentaires

Cela dépend si vous souhaitez utiliser les propriétés précédentes. Chaque fois que vous créez le formulaire avec le constructeur "NOUVEAU", vous perdez toutes les propriétés précédentes du formulaire. Donc, si vous souhaitez conserver les anciennes valeurs, vous ne pouvez pas supprimer l'ancien formulaire. Voir mon projet à deux formulaires: stackoverflow.com/questions/34975508/...


Merci. J'utilise show dialog qui, à mon avis, ne fonctionne pas de la même manière. Je peux me tromper.


La différence entre Show () et ShowDialog () réside dans la méthode Show () que vous pouvez renvoyer à partir du formulaire sans supprimer tandis que ShowDialog () vous devez fermer / supprimer le formulaire afin de pouvoir le retourner. Vous pouvez simplement passer de ShowDialog () à Show ().


3 Réponses :


0
votes

Cela dépend de ce que vous voulez vraiment.

Exemple: vous devez créer un formulaire de discussion pour votre application. Le formulaire exécuté charge un historique volumineux à partir d'une base de données. Dans ce cas, la meilleure décision est de ne pas renouveler votre formulaire.


1 commentaires

Bon point. Je dirais que passer l'ensemble de données rempli (liste générique, peu importe) dans une nouvelle copie serait une meilleure option, éliminant entre autres les problèmes de synchronisation des données entre les formulaires.



0
votes

La méthode 2, avec le mot-clé «using», est beaucoup plus propre et plus sûre.

Garder le formulaire en mémoire peut entraîner des comportements étranges difficiles à déboguer. Par exemple, si le formulaire a un minuteur qui affiche une boîte de message toutes les 5 secondes (comme un simple test), cette boîte de message continuera à apparaître même après avoir "fermé" le formulaire si vous ne le supprimez pas après utilisation, ce qui est le cas " utiliser "nettoierait pour vous. Même si vous avez l'intention de conserver les propriétés précédentes, il serait préférable de ne conserver que les propriétés et non le formulaire lui-même, et de transmettre les propriétés au formulaire chaque fois que vous l'instanciez. Il y a d'autres choses moins évidentes (comme la modification des valeurs dans les objets référencés) que vous pourriez perdre des heures à rechercher.


0 commentaires

0
votes

En C #, les variables doivent toutes deux être étendues aussi étroitement que possible. Le deuxième exemple vous permet d'utiliser une variable locale au lieu d'un champ, donc c'est «mieux», bien que vous ne devriez pas utiliser de trait de soulignement pour un nom de variable locale.

MyForm _form = new MyForm();

void button1_OnClick(object sender, EventArgs e)
{
    _form.ShowDialog(this);
}

public override void Dispose()
{
    _form.Dispose();
    base.Dispose();
}

Toutefois, si vous constatez que vous rencontrez un problème de performances lors du chargement et du déchargement du formulaire à plusieurs reprises, ou si vous devez conserver l'état du formulaire, il est parfaitement normal d'utiliser le premier exemple. N'oubliez pas de disposer le champ.

void button1_OnClick(object sender, EventArgs e)
{
    using (MyForm form = new MyForm())
    {
        form.ShowDialog(this);
    }
}


2 commentaires

Dans votre deuxième exemple, il y aura toujours une seule instance d'un MyForm, alors à quel moment appelleriez-vous la méthode dispose?


S'il s'agit du formulaire principal de votre application, il sera supprimé par le runtime à la fin de votre application. à proprement parler, ce n'est pas complètement nécessaire, car la fin du processus disposera également de toutes les ressources. Mais c'est une bonne pratique, surtout si vous pouvez introduire plus de formulaires ultérieurement.