2009-03-03 7 views
0

Petite question stupide, mais est resté bloqué pendant une longue période. J'ai écrit deux classes une qui est un formulaire (classe TreeDisplay) et l'autre qui contient la logique de buiseness (classe MyTreeNode). La classe TreeDisplay contient un bouton Parcourir pour sélectionner un fichier et le transmettre à une méthode InitiatingTree (nom de fichier de la chaîne) qui se trouve dans la classe MyTreeNode.
Maintenant, je dois passer ce paramètre de chaîne de caractères à la classe MyTreeNode. Lorsque j'exécute mon code, le fichier XML que j'ai sélectionné est affiché dans la zone de texte mais pas dans l'arborescence.
J'ai écrit la partie de code mais elle lance NullReferenceException (Référence d'objet non définie sur une instance d'un objet). Lorsque le code entier était écrit dans Form.cs, le code était exécuté avec succès, mais en séparant la logique métier, l'exception s'est produite. Pouvez-vous me dire où je me trompe?Comment passer le paramètre de chaîne d'une méthode d'une classe à une autre classe dans le même espace de noms?

Voici le code dans le bouton Parcourir de classe ArbreAfficher (Ma principale forme):

if (open.ShowDialog(this) == DialogResult.OK) 
     { 
      txtFileName.Text = open.FileName; 
      MytreeNodeClass treenodeClass = new MytreeNodeClass(); 
      treenodeClass.initiatingTree(open.FileName,treeView1); 
     } 

Voici le code de initiatingTree() dans ma classe MyTreeNode:

public class MytreeNodeClass 
{ 

    private readonly System.Windows.Forms.TextBox txtFileName; 
    private TreeView treeView1; 
    private readonly ToolStripStatusLabel toolStripStatusLabel1; 

    public string Filename 
    { 
     get { return filename; } 
    } 
    protected string filename; 

    public MytreeNodeClass() 
    { 
    } 

    public void initiatingTree(string nameofFile,TreeView treeView1) 
    { 
     try 
     { 
      //Create XML document & load the XML file. 
      XmlDocument xmlDocument = new XmlDocument(); 
      xmlDocument.Load(nameofFile); 
      treeView1 = new System.Windows.Forms.TreeView(); 
      treeView1.Nodes.Clear(); 

      if (xmlDocument.DocumentElement != null) 
      { 
       TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name); 

       treeView1.Nodes.Add(treeNodedoc); 
      } 

Sur l'utilisation de points d'arrêt treeView1.Nodes.Clear(), le code sort de cette ligne et entre dans le bloc catch en lançant NullReferenceException.

Veuillez aider à trouver la cause de l'exception. Merci.

Répondre

5

Quelle est la valeur de treeView1 à votre point d'arrêt?

Je suggère que cela peut être nul, car la référence n'est pas disponible dans votre couche de logique applicative.


Mise à jour avec le code exemple:

public void initiatingTree(string nameofFile, TreeView treeView1) 
{ 
    try 
    { 
     //Create XML document & load the XML file. 
     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.Load(nameofFile); 

     treeView1.Nodes.Clear(); 

     if (xmlDocument.DocumentElement != null) 
     { 
      TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name); 

      treeView1.Nodes.Add(treeNodedoc); 
     } 
    } 
} 

et où vous appelez ceci:

if (open.ShowDialog(this) == DialogResult.OK) 
{ 
    txtFileName.Text = open.FileName; 
    MytreeNodeClass treenodeClass = new MytreeNodeClass(); 
    treenodeClass.initiatingTree(open.FileName, treeView1); 
} 
+0

alors où dois-je faire la changements pour supprimer cette exception? –

+0

cahnge votre méthode pour accepter l'arbre comme paramètre, alors vous pouvez le passer de votre couche d'interface utilisateur – cjk

+0

Si cela ne vous dérange pas pouvez-vous fournir une syntaxe de ligne comment faire cela .. Merci –

0

Initialise l'objet Treeview1 avant d'y accéder.

+0

je l'ai fait aussi mais rien n'a changé. –

0

Je suppose que vous avez copié et collé, non?

De toute façon, voici une petite note: Lorsque vous faites glisser des contrôles sur un formulaire dans VS Designer, vs génère du code pour ces contrôles "généralement dans InitializeComponent()". VS écrit les références dans votre classe (par exemple form1.cs) comme ce qui suit:

private System.Windows.Forms.TreeView treeView1; 

ceci est juste une variable de déclarer le type System.Windows.Forms.TreeView cette variable (elle-même) est stockée sur la pile, parce que c'est juste une référence, une référence qui ne pointe pas vers les objets tas réels jusqu'à maintenant (c'est-à-dire NullReference). Maintenant, cette référence est inutile et vous ne pouvez pas l'utiliser à moins de l'initialiser et de lui indiquer un objet réel sur le tas, et c'est ce que VS fait pour vous dans le concepteur, il ajoute simplement la ligne suivante à InitializComponents:

this.treeView1 = new System.Windows.Forms.TreeView(); 

Et c'est la ligne que vous avez oublié de copier dans l'autre classe, qui a laissé votre référence non initialisée (i.e NullReference toujours), donc lorsque vous avez essayé de l'utiliser, une exception NullReferenceException a été levée. Je suppose que c'est ton problème ou du moins c'est comme ça que je pourrais le comprendre. Pardonnez-moi si je n'ai pas réussi à vous comprendre!

+0

Salut, merci d'avoir éclairci le doute. Vous avez raison je l'ai collé sur la classe MytreeNode.Mais j'ai essayé la syntaxe ci-dessus encore eu la même xception pouvez-vous dire où exactement dois-je mettre cette ligne de code? –

+0

en fait cela dépend, je veux dire, utiliserez-vous cet objet uniquement dans cette fonction ou voulez-vous l'utiliser, au niveau d'une classe. anyways Mettez cette ligne de code n'importe où avant d'utiliser l'objet, n'importe où avant cette ligne treeView1.Nodes.Clear() ;. recommandé: au début de la fonction ou le constructeur – Galilyou

+0

je veux l'utiliser sur un niveau de classe. J'ai écrit cette ligne au-dessus de treeView1.Nodes.Clear() a toujours la même exception.itried pour créer le constructeur et passé le paramètre treeview & utilisé cette ligne à l'intérieur du constructeur encore l'exception reste.Autre chose je peux essayer de supprimer cette exception? Tanx –

1

Comme c.k dit.

Vous n'avez pas accès aux paramètres usercontrols de votre couche de gestion en tant que standard. Puis-je vous suggérer de garder votre code de contrôle dans le code gui derrière pour plus de simplicité.

Un exemple comment trier votre code

(couche IUG) Codebehind pour l'interaction de contrôle
couche d'affaires pour la manipulation de données
couche de données pour les manipulations de base de données et une telle

+0

Désolé de dire que je n'ai pas ce que vous voulez dire par là .... je suis nouveau à C# donc très petite idée à ce sujet ... je ne sais pas quoi mettre exactement ?? Merci .. –