0

コードに「モジュールにコンポーネント4がない場合は、何も表示しない」と表示させようとしています。モジュールの詳細(名前、クレジット、評価など)を提供するXMLファイルから値を読み取り、LINQクエリコマンドを使用してそれらの値を書き出しています。

すべて正常に動作していますが、設定したい要件に関して問題が発生しました。基本的に、モジュールごとに評価の数が異なり、2、3、または4の評価があるものもあります。合計4つの評価があるモジュールの詳細を表示する必要がある場合、コードは正常に実行されますが、2つまたは3つの評価がある場合は取得します。この行のnullreferenceexception:

var assessmentFour = from d in document.Descendants("moduleTitle")
                                 where d.Value == (String)comboBoxTab4Mod1.SelectedItem
                                 select d.Parent.Element("assessmentFour").Value; //exception thrown here

コンボボックスで選択したモジュールのassessmentFour値がないため、スローされる理由がわかります。そのため、次を使用して解決しようとしました。

foreach (var item in assessmentFour)
        {
            if (assessmentFour != null)
            {
                labelTab4Mod1Cmpt4.Text = "";
            }
            else
            {
                labelTab4Mod1Cmpt4.Text = item.ToString();
            }
        }

しかし、それは機能しません。null参照例外を回避する他の方法がわかりません。誰かが私にそれを指摘してくれれば、私はそれをいただければ幸いです。

理解する必要がある場合は、XMLファイルを次に示します。

<?xml version="1.0" encoding="utf-8" ?>
<SoftwareEngineering>
  <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>
</SoftwareEngineering>

各モジュールに同じ数の評価がないことに注意してください。これがエラーが発生する理由です。おそらく、各モジュールにassessmentFour要素を追加して、そのようにすることができると思いますが、それは本当に安価です。誰かが私を助けてくれたら、私はそれを感謝することができます。ありがとうございました

4

2 に答える 2

1

あなたはこれを試すことができます...

from d in document.Descendants("moduleTitle")
where d.Value == (String)comboBoxTab4Mod1.SelectedItem
select CheckNullElement(d.Parent.Element("assessmentFour"))

次に、この関数をクラスのさらに下に定義します

private string CheckNullElement(XElement x)
{
  if (x == null) return string.Empty;

  return x.Value;
}
于 2012-04-15T13:55:27.140 に答える
0

これが私にとってうまくいったと思われる別のアプローチです:

        var assessmentFour = from d in doc.Descendants("Module")
                             where (string)d.Element("moduleTitle") == (String)comboBoxTab4Mod1.SelectedItem
                                         let el = d.Elements("assessmentFour").FirstOrDefault()
                                         select (el == null ? String.Empty : (string)el);
于 2012-04-15T14:55:46.237 に答える