在listBox中显示存储在数组中的每个模块的名称

时间:2012-04-02 00:03:35

标签: c# xml

我正在尝试将数组中的模块名称显示到listBox,但我收到"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

的行上收到了该错误

5 个答案:

答案 0 :(得分:1)

ModulesListBox为空,因为您在初始化之前访问它,或者modules数组包含空元素。

正如其中一位评论者所说,您可能最好使用XmlSerializer来处理将XML加载到模块集合中。如果无法做到这一点,请改为modules改为List<Modules>

答案 1 :(得分:1)

您将模块数组初始化为16个长度,然后使用modulecounter加载它,但在循环中使用数组长度。而是使用modulecounter变量来限制循环,如下所示:

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

对于每个值modulecounter及以上,您的数组为空。这就是错误的原因。

答案 2 :(得分:0)

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

答案 3 :(得分: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 s的完整集合,假设它被定义为

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

答案 4 :(得分:0)

如果您对内存没有任何问题(即:文件通常太大),那么我建议您不要使用XmlTextReader并使用XmlDocument代替:< / p>

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

上面的代码应该为您提取每个MName节点并将它们全部放在list中,并将其用于好处:)