2009-03-03 5 views
0

Kleine dumme Frage, aber blieb für eine lange Zeit stecken. Ich habe zwei Klassen geschrieben, die eine Form (TreeDisplay-Klasse) und andere, die Buiseness-Logik (MyTreeNode-Klasse) enthält. TreeDisplay-Klasse enthält Durchsuchen-Schaltfläche, um eine Datei auszuwählen, übergeben Sie es an eine Methode initialingTree (Zeichenfolge Dateiname), die in MyTreeNode-Klasse ist.
Jetzt muss ich diesen String-Parameter-Dateinamen MyTreeNode-Klasse übergeben. Wenn ich meinen Code ausführe, wird die XML-Datei, die ich ausgewählt habe, in der Textbox angezeigt, aber nicht in der Baumansicht.
Ich habe den Teil des Codes geschrieben, aber es wirft NullReferenceException (Objektreferenz nicht auf eine Instanz eines Objekts festgelegt). Wenn der gesamte Code in Form.cs geschrieben wurde, wurde der Code erfolgreich ausgeführt, aber beim Trennen der Geschäftslogik ist die Ausnahme aufgetreten. Können Sie mir bitte sagen, wo ich falsch liege? Wie übergeben Sie den String-Parameter einer Methode von einer Klasse an eine andere Klasse im selben Namespace?

Dies ist der Code in Schaltfläche Durchsuchen der Baumanzeige Klasse (Meine Hauptform):

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

Hier ist der Code von initiatingTree() in meiner MyTreeNode Klasse:

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); 
      } 

auf Breakpoint mit treeView1.Nodes.Clear(), der Code kommt aus dieser Zeile und gibt den catch-Block ein, der NullReferenceException auslöst.

Bitte helfen Sie die Ursache der Ausnahme zu finden. Vielen Dank.

Antwort

5

Was ist der Wert von treeView1 an Ihrem Haltepunkt?

Ich schlage vor, dass dies null sein kann, da die Referenz in Ihrem Business-Logik-Layer nicht verfügbar ist.


mit Beispielcode aktualisiert:

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); 
     } 
    } 
} 

und wo Sie diese nennen:

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

so sortieren, wo ich das machen zu tun haben, Änderungen, um diese Ausnahme zu entfernen? –

+0

ändern Sie Ihre Methode, um die Treeview als Parameter zu akzeptieren, dann können Sie es von Ihrer UI-Ebene – cjk

+0

übergeben Wenn Sie nichts dagegen haben können Sie eine Zeile Syntax wie das zu tun .. Danke –

0

das Objekt TreeView1 initialisieren, bevor sie zugreifen.

+0

Ich tat das auch, aber nichts änderte sich. –

0

Ich denke, Sie kopiert und eingefügt, oder?

Egal, hier ist eine kleine Notiz: Wenn Sie Steuerelemente auf einem Formular in VS Designer ziehen, generiert vs Code für diese Steuerelemente "in der Regel in InitializeComponent()". VS schreibt die Referenzen in Ihrer Klasse (zB form1.cs) wie folgt aus:

private System.Windows.Forms.TreeView treeView1; 

dies nur eine Variable vom Typ deklarieren System.Windows.Forms.TreeView diese Variable (selbst) auf dem Stapel gespeichert wird, weil es sich nur um eine Referenz handelt, eine Referenz, die bisher nicht auf tatsächliche Heap-Objekte verweist (zB NullReference). Nun ist diese Referenz nutzlos und Sie können sie nicht verwenden, es sei denn, Sie initialisieren sie und weisen darauf hin, dass sie auf ein echtes Objekt im Heap zeigt. Und das macht VS für Sie im Designer, fügt einfach die nächste Zeile zu InitializComponents hinzu:

Und das ist die Zeile, die Sie vergessen haben, in die andere Klasse zu kopieren, die Ihre Referenz nicht initialisiert (d.e noch NullReference), daher wurde eine NullReferenceException ausgelöst, als Sie versuchten, es zu verwenden. Ich schätze das ist dein Problem oder zumindest so könnte ich es verstehen. Verzeih mir, wenn ich dich nicht verstehen konnte!

+0

Hallo, danke für die Klärung der Zweifel. Sie sind richtig, ich habe es auf MytreeNode Klasse eingefügt.Aber ich habe versucht, die oben genannte Syntax auch immer noch die gleiche Xception können Sie plz sagen, wo genau muss ich diese Codezeile setzen? –

+0

tatsächlich hängt es ab, ich meine, werden Sie dieses Objekt nur innerhalb dieser Funktion verwenden oder möchten Sie es auf Klassenebene verwenden. Wie auch immer Setzen Sie diese Codezeile an einer beliebigen Stelle vor der Verwendung des Objekts irgendwo vor dieser Zeile treeView1.Nodes.Clear() ;. empfohlen: am Anfang der Funktion oder des Konstruktors – Galilyou

+0

möchte ich es auf Klassenebene verwenden. Ich habe diese Zeile über treeView1.Nodes.Clear() geschrieben, die immer noch die selbe exception.tiried hat, um den Konstruktor zu erzeugen und den Parameter treeview zu übergeben Ich benutze diese Linie innerhalb des Konstruktors immer noch die Ausnahme bleibt.Alles sonst kann ich versuchen, diese Ausnahme zu entfernen? Tanx –

1

Wie c.k sagte.

Sie haben keinen Zugriff auf die Benutzersteuerelemente von Ihrer Business-Schicht als Standard. Darf ich vorschlagen, dass Sie den Kontrollcode im GUI-Code zur Vereinfachung beibehalten.

Ein Beispiel, wie Ihr Code

(Gui Layer) Codebehind für die Steuerung Interaktion
Business Layer für die Datenmanipulation
Data Layer für Datenbank-Manipulationen und solche

+0

Sorry zu sagen, ich habe nicht bekommen, was Sie damit meinen .... Ich bin neu in C# so habe sehr wenig Ahnung darüber ... ich weiß nicht was genau zu setzen ?? Danke .. –

Verwandte Themen