1

私はxmlファイルを使用して内容を読み取り、チェックボックス付きのツリービューリストに表示しています。この条件は、ユーザーがコンボ ボックスで選択した内容に基づいてコンテンツが表示されることです。ユーザーがコンボ ボックスで 2 を選択した場合、ツリービュー リストには 2 (xml ファイルから) の内容が表示されます。私は次のように試しました:

private void pjctsel_cmbbox_SelectedIndexChanged(object sender, EventArgs e)
{            
    var xmldoc = File.ReadAllText(@"D:\\test.xml");
    var str = XElement.Parse(xmldoc);
    cmbbox_val = pjctsel_cmbbox.SelectedIndex.ToString();
***  var res = str.Elements(cmbbox_val).Where(x => x.Element("general").Value.Equals(cmbbox_val)).ToList();
    MessageBox.Show(res.ToString());
}
cmbbox_val = user selected value from combobox.

xmlfile の内容は次のとおりです。

<serv>
    <general name="one">    
    <server name="oneone">
        <service name="1143"/>
        <service name="1142"/>
    </server>
</general>
<general name="two">        
    <server name ="twoone">
        <service name="2143"/>
        <service name="2142"/>
    </server>
</general>
</serv>

*をマークした私の C# コードでは、次の例外が発生します。

ググってみましたが、タグ文字列 1 で始まる xml ファイルしか見つかりませんでした。

これに関するアイデアはありますか?

どんな考えでも本当に感謝します..

編集:

私のコンボ ボックスには、1、2 のような値があります。

私が試しているのは、ユーザーがコンボ ボックスで値 2 を選択した場合、アプリケーションは xml ファイルで 2 という名前のエントリをチェックする必要があり、一致するものが見つかった場合は、「サーバー名」ノードと「サービスname" の 2 つに対応するノードが、ツリービュー リストに表示されている必要があります。

これが理にかなっていることを願っています..

4

3 に答える 3

3
cmbbox_val = pjctsel_cmbbox.SelectedIndex.ToString();   // SelectedIndex is an integer

var res = str
            .Elements(cmbbox_val)                      // so this will fail
            .Where(x => x.Element("general")
            .Value.Equals(cmbbox_val)).ToList();

これはうまくいくかもしれません:

cmbbox_val = pjctsel_cmbbox.SelectedItem.ToString();   // or SelectedItem.SomeProperty

しかし、あなたが探しているのはcmbbox_val2 回であり、それがElement("general")既に XML のルートになっていることにも注意してください。したがって、これは機能しませんが、修正するための情報がありません。


編集後:

  1. 私のコンボ ボックスには、1、2 のような値があります。
  2. xml ファイルで名前が two のエントリを確認する必要があります
  3. 次に、「サーバー名」ノードと「サービス名」ノードをツリービュー リストに表示する必要があります。

ステップ 1) および 2)

var str = XElement.Parse(xmldoc);
IEnumerable<XElement> generals = str
       .Elements("general")
       .Where(g => g.Attribute("name") == cmbbox_val);

その結果は階層的であるため foreach()、Linq の代わりに次のように使用します。

foreach(var general in generals)  // probably only 1
{
   foreach (var server in general.Elements("server"))
   {
       string serverName = server.Attribute("name").value;

       foreach(var service  in server.Elements("service"))
       {
           // etc
       }
   }
}
于 2013-10-11T07:05:27.477 に答える
1

MSDN XElement.Elements()によると、選択する要素の名前を表す文字列をパラメーターとして受け取ります。名前を で始めることはできず、1を渡しているため、そのエラーが発生しcmbbox_valますElements()

ノード セレクターとして と のcmbbox_val両方にそれを使用しています。Value.Equalsstring "1143"

于 2013-10-11T07:10:43.147 に答える
0

integer問題は、 asを渡していることですXElement name。名前を数字で始めないでください。考えられる間違いは、コードでコンボボックスを渡すことです。SelectedIndex. コンボボックスを適切に構成した場合 (つまり、1,"one" 2,"two)、combobox. を渡す必要があります。コンボボックスSelectedValueの値リストを入力しない場合は、コードを次のように変更できます。

private void pjctsel_cmbbox_SelectedIndexChanged(object sender, EventArgs e)
    {            
        var xmldoc = File.ReadAllText(@"D:\\test.xml");
        var str = XElement.Parse(xmldoc);
        string cmbbox_val = pjctsel_cmbbox.SelectedIndex==0 ? "one" : "two";
        var res = str.Elements(cmbbox_val).Where(x => x.Element("general").Value.Equals(cmbbox_val)).ToList();
        MessageBox.Show(res.ToString());
    }
于 2013-10-11T07:12:55.737 に答える