C# 组合框对象上的NullReferenceException-C

C# 组合框对象上的NullReferenceException-C,c#,winforms,nullreferenceexception,C#,Winforms,Nullreferenceexception,我正在尝试将XML文件中的一些元素显示到使用选项卡的表单中 但是,我在以下代码行中得到了错误NullReferenceException: var assessment1 = from d in document.Descendants("moduleTitle") where d.Value == (comboBoxModuleSelect[i] as ComboBox).SelectedItem.ToString() //error h

我正在尝试将XML文件中的一些元素显示到使用选项卡的表单中

但是,我在以下代码行中得到了错误NullReferenceException:

var assessment1 = from d in document.Descendants("moduleTitle")
                            where d.Value == (comboBoxModuleSelect[i] as ComboBox).SelectedItem.ToString() //error here on this line
                            select d.Parent.Element("assessmentOne").Value;
这段代码在一个按钮点击中,点击后会生成新的组合框。我的做法如下:

private void buttonLevel4Add_Click(object sender, EventArgs e)
        {
            var document = XDocument.Load(workingDir + @"\Level4.xml");
            comboBoxModuleSelect.Add(new ComboBox());
            System.Drawing.Point p = new System.Drawing.Point(7, 57 + i * 25);
            (comboBoxModuleSelect[i] as ComboBox).Location = p;
            (comboBoxModuleSelect[i] as ComboBox).Size = new System.Drawing.Size(183, 20);
            tabPageLevel4.Controls.Add(comboBoxModuleSelect[i] as ComboBox);
        }
整数i是一个类变量,每次单击按钮时我都会增加该变量,以便创建一个新的组合框

上面的代码片段可能会让人困惑,因为它们不符合顺序,所以下面是整个类:

public partial class Form1 : Form
    {
        String workingDir = Directory.GetCurrentDirectory();
        ArrayList comboBoxModuleSelect = new ArrayList();
        ArrayList labelAssessments = new ArrayList();
        int i = 0; //for combo boxes

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tabControl.SelectTab(1);
        }

        private void buttonLevel4Add_Click(object sender, EventArgs e)
        {
            var document = XDocument.Load(workingDir + @"\Level4.xml");
            comboBoxModuleSelect.Add(new ComboBox());
            System.Drawing.Point p = new System.Drawing.Point(7, 57 + i * 25);
            (comboBoxModuleSelect[i] as ComboBox).Location = p;
            (comboBoxModuleSelect[i] as ComboBox).Size = new System.Drawing.Size(183, 20);
            tabPageLevel4.Controls.Add(comboBoxModuleSelect[i] as ComboBox);

            this.labelAssessments.Add(new Label());
            System.Drawing.Point pLabel = new System.Drawing.Point(200 + i * 25, 81);
            (labelAssessments[i] as Label).Location = pLabel;
            (labelAssessments[i] as Label).Size = new System.Drawing.Size(80, 13);
            tabPageLevel4.Controls.Add(labelAssessments[i] as Label);


            var moduleName = from d in document.Descendants("moduleTitle")
                        select d.Value;
            foreach (var item in moduleName)
            {
                //add the module names into the dropdown for students to select
                (comboBoxModuleSelect[i] as ComboBox).Items.Add(item);
            }

            var assessment1 = from d in document.Descendants("moduleTitle")
                            where d.Value == (comboBoxModuleSelect[i] as ComboBox).SelectedItem.ToString()
                            select d.Parent.Element("assessmentOne").Value;
            foreach (var item in assessment1)
            {

                (labelAssessments[i] as Label).Text = item.ToString();

            }


            i++;//for drawing

        }
下面是XML:

<Course>
  <CourseName>BEng Software Engineering</CourseName>
  <Modules>
    <Module>
      <moduleCode>ECSE401</moduleCode>
      <moduleTitle>Programming Methodology</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Coursework</assessmentOne>
      <assessmentOneWeight>40</assessmentOneWeight>
      <assessmentTwo>Coursework</assessmentTwo>
      <assessmentTwoWeight>40</assessmentTwoWeight>
      <assessmentThree>Test</assessmentThree>
      <assessmentThreeWeight>20</assessmentThreeWeight>
    </Module>
    <Module>
      <moduleCode>ECSC404</moduleCode>
      <moduleTitle>Computer Systems Fundamentals</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Test1</assessmentOne>
      <assessmentOneWeight>30</assessmentOneWeight>
      <assessmentTwo>Test2</assessmentTwo>
      <assessmentTwoWeight>30</assessmentTwoWeight>
      <assessmentThree>Test3</assessmentThree>
      <assessmentThreeWeight>40</assessmentThreeWeight>
    </Module>
    <Module>
      <moduleCode>EBSY401</moduleCode>
      <moduleTitle>Information and Data Modelling</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Test</assessmentOne>
      <assessmentOneWeight>25</assessmentOneWeight>
      <assessmentTwo>Coursework1</assessmentTwo>
      <assessmentTwoWeight>10</assessmentTwoWeight>
      <assessmentThree>Coursework2</assessmentThree>
      <assessmentThreeWeight>35</assessmentThreeWeight>
      <assessmentFour>Coursework3</assessmentFour>
      <assessmentFourWeight>30</assessmentFourWeight> 
    </Module>
    <Module>
      <moduleCode>ECSC405</moduleCode>
      <moduleTitle>Software Development Principles</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Test1</assessmentOne>
      <assessmentOneWeight>30</assessmentOneWeight>
      <assessmentTwo>Coursework</assessmentTwo>
      <assessmentTwoWeight>40</assessmentTwoWeight>
      <assessmentThree>Test2</assessmentThree>
      <assessmentThreeWeight>30</assessmentThreeWeight>
    </Module>
    <Module>
      <moduleCode>ECSC407</moduleCode>
      <moduleTitle>Web Technology</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Tutorials</assessmentOne>
      <assessmentOneWeight>20</assessmentOneWeight>
      <assessmentTwo>Coursework</assessmentTwo>
      <assessmentTwoWeight>20</assessmentTwoWeight>
      <assessmentThree>Exam</assessmentThree>
      <assessmentThreeWeight>60</assessmentThreeWeight>
    </Module>
    <Module>
      <moduleCode>ECSC409</moduleCode>
      <moduleTitle>Software Engineering Principles</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Coursework1</assessmentOne>
      <assessmentOneWeight>40</assessmentOneWeight>
      <assessmentTwo>Coursework2</assessmentTwo>
      <assessmentTwoWeight>30</assessmentTwoWeight>
      <assessmentThree>Coursework3</assessmentThree>
      <assessmentThreeWeight>30</assessmentThreeWeight>
    </Module>
    <Module>
      <moduleCode>ECSC408</moduleCode>
      <moduleTitle>Mathematics for Computing</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Coursework</assessmentOne>
      <assessmentOneWeight>50</assessmentOneWeight>
      <assessmentTwo>Exam</assessmentTwo>
      <assessmentTwoWeight>50</assessmentTwoWeight>
    </Module>
    <Module>
      <moduleCode>EBSY400</moduleCode>
      <moduleTitle>Communication and Learning Skills</moduleTitle>
      <credits>15</credits>
      <assessmentOne>Coursework</assessmentOne>
      <assessmentOneWeight>30</assessmentOneWeight>
      <assessmentTwo>Coursework</assessmentTwo>
      <assessmentTwoWeight>70</assessmentTwoWeight>
    </Module>
  </Modules>
</Course>
我不明白为什么会出现nullreference异常,请有人帮助

索引I处的组合框可能未被选中,因此SelectedItem返回null,或者d可能为null

鉴于您使用上面的document.substands没有问题,我认为是选择给您带来了麻烦

尝试:


我猜你已经在combobox中添加了很多项,但是没有一项被选中。这就是SelectedItem返回null的原因。

ya,问题是,一旦我单击按钮,它会弹出错误,在单击按钮之前,我无法在组合框中输入任何值选择元素?这解决了错误问题,但我无法将任何值输出到标签上,我认为获取XML元素有问题。您可以为from/where/select构造的每个增量部分输出assessment1中item的值,并查看它是否符合您的预期。请注意,不要这样做:ComboBox模块选择[I]作为ComboBox.Location。如果您假设安全转换不会返回null,那么就没有理由首先执行安全转换,只需使用C样式转换,就可以执行一个转换并将引用存储在变量中。此外,这里没有理由使用ArrayList,因为在1.1中引入了泛型,所以几乎没有理由使用ArrayList。你的代码做了很多假设,显然其中至少有一个是错误的。事实上,我认为问题出在我的逻辑上,整个操作只需点击一个按钮。当我运行程序时,屏幕上没有组合框,因此操作compare d.Value with comboBox.SelectedItem总是为空,因为我没有选择任何内容,因此程序在第一次单击时关闭。我的假设正确吗?
ComboBox cb = comboBoxModuleSelect[i] as ComboBox;
if (cb.SelectedItem != null ) {
  var assessment1 = from d in document.Descendants("moduleTitle") 
    where (d.Value == cb.SelectedItem.ToString())
    select d.Parent.Element("assessmentOne").Value;
}