2012-04-02 5 views
0

Ich versuche, die Modulnamen aus dem Array auf die ListBox anzuzeigen, aber ich bekomme einen "NullReferenceException was unhandled" Fehler.Den Namen jedes Moduls im Array in einer ListBox anzeigen

modules.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Modules> 
    <Module> 
    <MCode>3SFE504</MCode> 
    <MName>Algorithms and Data Structures</MName> 
    <MCapacity>5</MCapacity> 
    <MSemester>1</MSemester> 
    <MPrerequisite>None</MPrerequisite> 
    <MLectureSlot>0</MLectureSlot> 
    <MTutorialSlot>1</MTutorialSlot> 
    </Module> 

</Modules> 

form1.cs

Modules[] modules = new Modules[16]; 
Modules[] pickedModules = new Modules[8]; 
int modulecounter = 0, moduleDetailCounter = 0; 
while (textReader.Read()) 
{ 
    XmlNodeType nType1 = textReader.NodeType;  
    if ((nType1 != XmlNodeType.EndElement) && (textReader.Name == "ModuleList")) 
    {  
     // ls_modules_list.Items.Add("MODULE"); 
     Modules m = new Modules(); 
     while (textReader2.Read()) //While reader 2 reads the next 7 TEXT items 
     { 
      XmlNodeType nType2 = textReader2.NodeType; 
      if (nType2 == XmlNodeType.Text) 
      { 
       if (moduleDetailCounter == 0) 
        m.MCode = textReader2.Value; 
       if (moduleDetailCounter == 1) 
        m.MName = textReader2.Value; 
       if (moduleDetailCounter == 2) 
        m.MCapacity = textReader2.Value; 
       if (moduleDetailCounter == 3) 
        m.MSemester = textReader2.Value; 
       if (moduleDetailCounter == 4) 
        m.MPrerequisite = textReader2.Value; 
       if (moduleDetailCounter == 5) 
        m.MLectureSlot = textReader2.Value; 
       if (moduleDetailCounter == 6) 
        m.MTutorialSlot = textReader2.Value; 
       // ls_modules_list.Items.Add(reader2.Value); 
       moduleDetailCounter++; 
      } 
      if (moduleDetailCounter == 7) { moduleDetailCounter = 0; break; } 

     } 
     modules[modulecounter] = m; 
     modulecounter++; 
     } 
    } 
    for (int i = 0; i < modules.Length; i++) 
    {      
     ModulesListBox.Items.Add(modules[i].MName); // THE ERROR APPEARS HERE 
    } 
} 

Ich erhalte diese Störung auf der Linie, die mit // THE ERROR APPEARS HERE markiert.

+1

Versuchen Sie, Ihr Problem einzuschränken und * spezifische * Fragen zu posten. Kopieren Sie Ihren gesamten Code und bitten Sie die Leute, es für Sie zu debuggen, ist nicht der richtige Weg. –

+1

scheint dies etwas viel besser von 'XmlSerializer' gehandhabt zu werden –

+0

@Attila Kal-El Egemensoy: gibt es irgendwelche Einschränkungen bei der Verwendung von' XmlDocument'? –

Antwort

0

die for-Schleife läuft von 0 bis 16, aber Module ist nur 0-15, ändern modules.length zu (modules.length -1)

+0

immer noch den gleichen Fehler, der MName ist mit meiner ModuleList-Klasse verknüpft und deklariert als "öffentliche String MName;" –

+0

Das Symbol <

1

Entweder ModulesListBox ist null, weil du es bist zugreifen, bevor es initialisiert wird, oder die modules Array enthält leer Elemente.

Wie einer der Kommentatoren sagte, ist es wahrscheinlich besser, XmlSerializer zu verwenden, um das Laden der XML in die Sammlung von Modulen zu ermöglichen. Wenn das nicht möglich ist, ändern Sie stattdessen modules in eine List<Modules>.

0

Fast positiv ist das Problem irgendwo mit Ihrer Deserialisierungslogik. Man könnte es debuggen, aber warum das Rad neu erfinden?

var serializer = new XmlSerializer(typeof(List<Module>), new XmlRootAttribute("Modules")); 
using (var reader = new StreamReader(workingDir + @"\ModuleList.xml")) 
    var modules = (List<Module>)serializer.Deserialize(reader); 

wäre dies eine schöne komplette Sammlung von Module s geben vorausgesetzt, es als

public class Module 
{ 
    public string MCode; 
    public string MName; 
    public int MCapacity; 
    public int MSemester; 
    public string MPrerequisite; 
    public int MLectureSlot; 
    public int MTutorialSlot; 
} 
0

definiert wurde Wenn Sie keine Probleme mit dem Gedächtnis haben (dh: die Datei in der Regel nicht zu groß ist), dann schlage ich nicht XmlTextReader und mit XmlDocument stattdessen zu verwenden:

XmlDocument d = new XmlDocument(); 
d.Load(@"FileNameAndDirectory"); 
XmlNodeList list = d.SelectNodes("/Modules/Module/MName"); 
foreach (XmlNode node in list) 
{ 
    // Whatsoever 
} 

Der obige Code sollte Vorabend extrahieren ry MName Knoten für Sie und sie alle in list setzen, ist es für eine gute

:) verwenden
1

Sie initialisieren Array Ihre Module 16 in der Länge zu sein und Sie es mit dem modulecounter, aber in der Schleife, die die Array-Länge verwenden laden. Stattdessen verwenden Sie die modulecounter Variable um die Schleife zu begrenzen, wie folgt aus:

for (int i = 0; i < modulecounter; i++) 
{      
    ModulesListBox.Items.Add(modules[i].MName); 
} 

Ihr Array ist für jeden Wert modulecounter und bis null. Deshalb der Fehler.

Verwandte Themen