2012-04-11 24 views
0

XMLファイルからタブを使用しているフォームにいくつかの要素を表示しようとしています。コンボボックスオブジェクトのNullReferenceException - C#

しかし、私は次のコード行にエラー「と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); 
     } 

整数私はボタンが新しいコンボボックスを作成するためにクリックされるたびにインクリメントクラス変数、次のとおりです。次のように私はそれをやった方法です。

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> 

私は理解していない、彼らは順番にないだから

上記のスニペットはので、ここで全体のクラスがあり、混乱を招くかもしれませんなぜnull参照例外が発生しているのですか?誰かに助けてもらえますか

+0

サイドノートでは、これをしないでください: '(comboBoxModuleSelect [i] ComboBox).Location'。安全なキャストが 'null 'を返さないと仮定している場合は、最初に安全なキャストを実行する理由はなく、単にCスタイルのキャストを使用してください(そのキャストを実行し、変数)。また、ここで 'ArrayList'を使う理由はありません(1.1のジェネリックの導入以来ほとんどありません)。あなたのコードは多くの仮定を作り出しており、明らかに少なくとも1つは間違っています。 –

+0

実際、問題は私のロジックだと思う、操作全体はボタンをクリックしている。プログラムを実行するとコンボボックスが画面に表示されないので、d.ValueとcomboBox.SelectedItemを比較する操作は、何も選択していないため常にnullになるため、プログラムは最初のクリックで終了します。 これを前提にして正しいですか? – a7omiton

答えて

2

インデックスiのコンボボックスが選択されていない可能性があります(SelectedItemがnullを返す)またはd

はあなたが問題なく上document.Descendantsを使用することを見てヌルかもしれないが、私はそれはあなたにトラブルを起こし選択だと思います

試してみてください。

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

さて、ボタンをクリックすると、エラーが表示され、コンボボックスに値を入力することはできません。 – a7omiton

+0

ボタンをクリックする前に要素を選択しますか? – Attila

+0

これはエラーの問題を解決しますが、私のラベルに出力される値は得られません。XML要素を取得する際に問題があると思います。 – a7omiton

0

私はあなたが束を追加したと思いますコンボボックスにアイテムを追加しましたが、選択されていませんでした。だからSelectedItemnullを返します。

関連する問題