2012-04-02 61 views
0

我试图显示模块名称从数组到列表框,但我得到一个"NullReferenceException was unhandled"错误。显示列表框中存储的每个模块的名称

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

我得到上标有// THE ERROR APPEARS HERE行的错误。

+1

尝试缩小问题范围,并发布*特定*问题。复制粘贴您的所有代码并要求人们为您调试它并不是一种好的方法。 – 2012-04-02 00:07:45

+1

这似乎是'XmlSerializer'处理好得多的东西 – 2012-04-02 00:08:00

+0

@Attila Kal-El Egemensoy:使用'XmlDocument'有什么限制吗? – 2012-04-02 00:38:09

回答

0

for循环从0到16,但模块是只有0到15,改变modules.length到(modules.length -1

+0

仍然得到相同的错误,MName链接到我的ModuleList类并被decalared为“public String MName;” – 2012-04-02 00:17:31

+0

'<'符号处理modules.length,但他初始化为16长度,即使他不会全部加载。看到我的答案。 – 2012-04-02 18:12:55

1

要么ModulesListBox为null,因为你访问它,它被初始化或modules数组包含空之前元素。

就像其中一位评论者说的那样,您可能最好使用XmlSerializer来将XML加载到模块集合中。如果这是不可能的,改为modules改为List<Modules>

0

几乎正面的问题是在你的反序列化逻辑的某个地方。人们可以调试它,但为什么要重新发明轮子?

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

这将给予Module小号假设它被定义为

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

如果你有记忆没有问题一个很好的完整的集合(即:文件通常是不大)那么我建议不要使用XmlTextReader和使用XmlDocument代替:

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

上面的代码应提取前夕ry MName节点为你,并把它们全部在list,使用它为好:)

1

你初始化你的模块数组为16,并加载它与modulecounter,但在循环中使用数组长度。而是使用modulecounter变量来限制循环,就像这样:

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

你的阵列是空的每一个值modulecounter以上。这就是错误的原因。