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参照例外が発生しているのですか?誰かに助けてもらえますか
サイドノートでは、これをしないでください: '(comboBoxModuleSelect [i] ComboBox).Location'。安全なキャストが 'null 'を返さないと仮定している場合は、最初に安全なキャストを実行する理由はなく、単にCスタイルのキャストを使用してください(そのキャストを実行し、変数)。また、ここで 'ArrayList'を使う理由はありません(1.1のジェネリックの導入以来ほとんどありません)。あなたのコードは多くの仮定を作り出しており、明らかに少なくとも1つは間違っています。 –
実際、問題は私のロジックだと思う、操作全体はボタンをクリックしている。プログラムを実行するとコンボボックスが画面に表示されないので、d.ValueとcomboBox.SelectedItemを比較する操作は、何も選択していないため常にnullになるため、プログラムは最初のクリックで終了します。 これを前提にして正しいですか? – a7omiton