在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
的线上看到了那个错误。
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
中,永远使用它:)