2012-04-02 5 views
0

配列からlistBoxにモジュール名を表示しようとしていますが、"NullReferenceException was unhandled"エラーが発生しています。配列に格納されている各モジュールの名前をlistBoxに表示

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でマークされている行にそのエラーを取得しています。 forループ

+1

問題を絞り込み、*具体的な質問を投稿してください。すべてのコードをコピーして貼り付け、デバッグするように要求するのは道のりではありません。 –

+1

これは 'XmlSerializer'で処理した方がはるかに良いようです。 –

+0

@Attila Kal-El Egemensoy:' XmlDocument'の使用に制限はありますか? –

答えて

0

0から16まで実行されますが、モジュールは、それが初期化またはmodules配列が空に含まれる前に、あなたがそれにアクセスしているので(modules.length -1

+0

はまだ同じエラーが発生していますが、MNameはModuleListクラスにリンクされており、 "public String MName;"としてデカールされます。 –

+0

'<'記号はmodules.lengthを処理しますが、それをすべてロードしません。私の答えを見てください。 –

1

どちらのModulesListBoxがnullにmodules.lengthを変更する、唯一の0〜15であります要素。

コメント者の一人が言ったように、XmlSerializerを使用してXMLをモジュールのコレクションに読み込む処理を行う方がよいでしょう。それができない場合はmodulesList<Modules>に変更してください。

0

ほとんどの肯定的な問題は、デシリアライズロジックのどこかにあります。それをデバッグすることはできますが、なぜホイールを再発明するのでしょうか?

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); 

これは、あなたがメモリに問題(例:ファイルは通常すぎ大きくない)を持っていない場合は、それが

public class Module 
{ 
    public string MCode; 
    public string MName; 
    public int MCapacity; 
    public int MSemester; 
    public string MPrerequisite; 
    public int MLectureSlot; 
    public int MTutorialSlot; 
} 
0

と定義したと仮定しModule秒の素敵な完全なコレクションを与えるだろう、その後、私はXmlTextReaderを使用しないようお勧めし、代わりにXmlDocumentを使用して:

XmlDocument d = new XmlDocument(); 
d.Load(@"FileNameAndDirectory"); 
XmlNodeList list = d.SelectNodes("/Modules/Module/MName"); 
foreach (XmlNode node in list) 
{ 
    // Whatsoever 
} 

上記のコードは前夜を抽出しなければなりませんRY MNameあなたのためのノードとは、あなたの長さが16であるためにあなたのモジュールの配列を初期化し、あなたがmodulecounterでそれをロードしますが、ループ内の配列長を使用する良い:)

1

のためにそれを使用し、listでそれらのすべてを置きます。代わりに、このように、ループを制限するmodulecounter変数を使用します。

for (int i = 0; i < modulecounter; i++) 
{      
    ModulesListBox.Items.Add(modules[i].MName); 
} 

あなたの配列は、すべての値modulecounterとアップのためのnullです。それがエラーの理由です。

関連する問題