在listBox中显示阵列中存储的每个模块的名称

本文关键字:模块 存储 listBox 显示 阵列 | 更新日期: 2023-09-27 18:29:52

我试图将数组中的模块名称显示到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的线上看到了那个错误。

在listBox中显示阵列中存储的每个模块的名称

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

正如一位评论者所说,您最好使用XmlSerializer来处理将XML加载到模块集合中的操作。如果不可能,请将modules更改为List<Modules>

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

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

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

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

几乎可以肯定的是,反序列化逻辑存在问题。人们可以调试它,但为什么要重新发明轮子呢?

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

如果您的内存没有问题(即:文件通常不是太大),那么我建议不要使用XmlTextReader,而是使用XmlDocument

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

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