2012-05-01 4 views
0

私は以下のコードを持つQuestionsというカスタムプロパティを持っています。C#のカスタムプロパティで各アイテムのリストにアクセスする必要がある

public class Questions 
{ 
    private List<Question> _q = new List<Question>(); 

    public List<Question> Question 
    { 
     get { return _q; } 
    } 
} 

public class Question 
{ 
    public string Text { get; set; } 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public string Answer { get; set; } 
    private List<string> _Options = new List<string>(); 

    public List<string> Option { 
     get { return _Options; } 
    } 

} 

私は私が期待した出力を得ることはありません下のコードでそれにアクセスしようとしたとき、私は、今

XmlDocument doc = new XmlDocument(); 
    Question q = new Question(); 
    Questions qs = new Questions(); 
    doc.Load(string.Format(@"questions.xml")); 
    XmlNodeList list = doc.SelectNodes("https://stackoverflow.com/questions/question"); 
    foreach (XmlNode node in list) 
    { 

      q.Text = node.SelectSingleNode("text").InnerText; 
      q.Type = node.SelectSingleNode("type").InnerText; 
      q.Name = node.SelectSingleNode("name").InnerText; 
      XmlNodeList options = doc.SelectNodes("https://stackoverflow.com/questions/question/options"); 
      foreach (XmlNode option in options) 
      { 
       q.Option.Add(option.SelectSingleNode("option").InnerText); 
      } 
      load.Visible = false; 
      qa.Visible = true; 

      qs.Question.Add(q); 
      DisplayQuestion(qs); 

    } 

の下のコードでプロパティを読み込みます。そして、これが私が助けを必要とするところです。

<?xml version="1.0"?> 
<questions> 
    <question> 
    <num>1</num> 
    <type>radio</type> 
    <text>Do you like cake?</text> 
    <options> 
     <option>Yes</option> 
     <option>No</option> 
     <option>Sometimes</option> 
    </options> 
    <name>cake</name> 
    </question> 
    <question> 
    <num>2</num> 
    <type>dropdown</type> 
    <text>Do you like TV?</text> 
    <options> 
     <option>Yes</option> 
     <option>No</option> 
     <option>Sometimes</option> 
    </options> 
    <name>tv</name> 
    </question> 
    <question> 
    <num>3</num> 
    <type>checkbox</type> 
    <text>What do you like?</text> 
    <options> 
     <option>Cake</option> 
     <option>TV</option> 
     <option>Flipper Reruns</option> 
    </options> 
    <name>flipper</name> 
    </question> 
</questions> 

そして出力:

あなたは何が好きですかサンプルXMLは、下

   Label1.Text = q.Question[CurrentQ].Text; 
       for (int i = 0; i < q.Question[CurrentQ].Option.Count; i++) 
       { 
        CheckBoxList1.Items.Add(q.Question[CurrentQ].Option[i]); 
       } 

XMLにありますか?

はい

はい

ケーキ

はい

はい

ケーキ

はい

はいあなたはdocの代わりに、ループの内部現在nodeからオプション・ノードを選択している

+0

役に立てば幸いロハス 種類リガード? –

+0

現在受け取っている出力は何ですか? – Tejs

+0

出力は である必要があります。 ケーキ テレビ フリッパーリール –

答えて

2

入れ、この代わりに

node.SelectNodes("options/option");    

すべてを試してみてください。 エラーは以下のコードにあります。

C#は自動的に参照(オブジェクトをコピーする代わりにポインタを意味します)で動作します。 上記のステートメントでQuestion q = new Question();を宣言し、それを記入してリストに追加してもう一度記入してください。これは、1つの質問のみがインスタンス化されることを意味し、結果はすべて同じです。

XmlDocument doc = new XmlDocument(); 

Questions qs = new Questions(); 
doc.Load(string.Format(@"questions.xml")); 
XmlNodeList list = doc.SelectNodes("https://stackoverflow.com/questions/question"); 
foreach (XmlNode node in list) 
{ 
     Question q = new Question(); // <--- Look here 

     q.Text = node.SelectSingleNode("text").InnerText; 
     q.Type = node.SelectSingleNode("type").InnerText; 
     q.Name = node.SelectSingleNode("name").InnerText; 
     XmlNodeList options = doc.SelectNodes("https://stackoverflow.com/questions/question/options"); 
     foreach (XmlNode option in options) 
     { 
      q.Option.Add(option.SelectSingleNode("option").InnerText); 
     } 
     load.Visible = false; 
     qa.Visible = true; 

     qs.Question.Add(q); 


} 
DisplayQuestion(qs); //<-- And here 

この方法では、毎回新しい質問をインスタンス化し、代わりに上書きされたのリストに追加されます。あなたの質問リストにはすべてのエントリが、あなたが持っている質問オブジェクトの1つのインスタンスへのポインタにすぎないからです。

ああ、なぜ私はDisplayQuestion(qs);をそこに置いたのですか? リスト全体を繰り返し何度も描画したくないので、私たちは何をしますか?

は、あなたのDisplayquestion機能は、各質問トラフのLOPと右のコントロール

を描くことを確認してください

私はこれが** **出力あなたは何を期待しているされて

+0

これは助けになりますが、正しい質問と正しい数のオプションが表示されますが、すべての質問に対して最初のオプションが表示されます。 –

+0

@JDRoberson:私の答えをご覧ください。私はなぜこれが起こるのか説明しています。 –

+0

お世話になりました、ありがとうございます、私は何時間も頭を掻き回してきました! –

2

ケーキ。

この式

doc.SelectNodes("https://stackoverflow.com/questions/question/options"); 

利回り

<options> 
    <option>Yes</option> 
    <option>No</option> 
    <option>Sometimes</option> 
</options> 
<options> 
    <option>Yes</option> 
    <option>No</option> 
    <option>Sometimes</option> 
</options> 
<options> 
    <option>Cake</option> 
    <option>TV</option> 
    <option>Flipper Reruns</option> 
</options> 

あなたは常にすべてのグループの最初のオプションを取るオプショングループのこのリストから!

はこれに対する答えは非常に簡単です一緒に

foreach (XmlNode node in list) { 
    Question q = new Question(); // As RoXaS pointed out! 
    ... 
    XmlNodeList options = node.SelectNodes("options/option"); 
    foreach (XmlNode option in options) { 
     q.Option.Add(option.InnerText); 
    } 
    ... 
    qs.Question.Add(q); 
} 
+0

これも修正されました。ご協力いただきありがとうございます! –

関連する問題