2010-06-03 18 views
1

Je tente d'afficher un formulaire spécifique à l'aide d'un contrôle treeview, dont les nœuds ont leur valeur tag définie sur une instance de la forme que j'ai besoin d'afficher. Le code que j'ai dans l'événement DoubleClick fonctionne très bien pour la première fois que je montre un formulaire, mais après cela, je reçois une exception d'objet. Comme vous pouvez le voir, j'ai essayé de le manipuler en réinitialisant le tag, mais cela n'a pas fonctionné. Est-il possible que je puisse montrer le formulaire plus d'une fois sans passer par une instruction de commutateur chaque fois que l'exception se lève et réinitialiser l'étiquette au bon type de formulaire? Je voudrais quelque chose de plus joli ressemblant à la façon dont je montre la forme.Afficher le formulaire à partir de TreeView dans VB.NET

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim fm2 As New Form2() 
     Dim fm3 As New Form3() 
     TreeView1.Nodes(0).Tag = fm2 
     TreeView1.Nodes(1).Tag = fm3 
    End Sub 

    Private Sub TreeView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.DoubleClick 
     Try 
      CType(TreeView1.SelectedNode.Tag, Form).Show() 
     Catch odex As ObjectDisposedException 
      TreeView1.SelectedNode.Tag = New Form() 
      TreeView1_DoubleClick(sender, e) 
     Catch nrex As NullReferenceException 
      'No node selected, do nothing. 
     End Try 
    End Sub 
End Class 

Répondre

1

Votre problème ici est que si l'utilisateur ferme le formulaire, l'objet aura été éliminé.

Il y a plusieurs façons de gérer cela, certaines plus élégantes les unes que les autres.

  1. Ajouter un gestionnaire pour FormX_Closed() à ce moment, vous pouvez réinitialiser la référence tag
  2. Vous pouvez passer à un processus de « dialogue Afficher », puis remis à zéro avant votre méthode DoubleClick() se termine

Cela dépend vraiment de ce que font ces formes. Typiquement, je verrais votre méthode DoubleClick faire une recherche puis créer l'instance, simplement parce que si vous créez des instances vous utilisez de la mémoire qui pourrait ne pas être nécessaire, mais c'est quelque chose qui pourrait être nécessaire compte tenu de votre application.

Recherche Exemple

Comme demandé dans les commentaires, si je devais le faire d'une manière différente, j'utiliser une valeur d'énumération, ou même un simple entier valeur « clé » pour la balise. Ensuite, je voudrais créer quelque chose comme le suivant pour le montrer.

Select Case myTag 
    Case 1 
     Dim formInstance As New Form1() 
     formInstance.Show() 
    Case Else 
     Dim formInstance As New Form2() 
     formInstance.Show() 
End Select 

centraliser fond et lancer le formulaire sur demande, vous pouvez passer cela pour un autre modèle, si vous vouliez plus de contrôle ou a eu beaucoup de différents types de formulaires.

+0

Comment feriez-vous la recherche pour créer l'instance? –

+0

Exemple ajouté, "myTag" est la valeur de votre balise actuelle –

1

La forme est disposée lorsqu'elle est fermée par l'utilisateur. Une option consiste à gérer l'événement Closing du formulaire et à le cacher au lieu de le fermer.