2

私は .net 初心者です。XML ファイルを読み込んで、2 つのコンボボックスに表示していますcbProductcbBrandName

cbBrandNameで選択したテキストに関してテキストを表示する必要がありますcbProduct

以下のコードを実装しました。

DataSet ds = new DataSet();
ds.ReadXml(@"..\..\stock.xml");

cbProduct.DataSource = ds.Tables[0].DefaultView.ToTable(true, "productname");
cbProduct.DisplayMember = "productname";

cbBrandName.DataSource = ds.Tables[0].DefaultView.ToTable(true, "brandname");
cbBrandName.DisplayMember = "brandname";

上記のコードは、 内のすべてのテキスト値を表示していますcbBrandName。でxmlファイルの選択した「productname」列にリンクされているテキスト値のみを表示するようにする方法cbProduct

助けてください。
前もって感謝します。

4

2 に答える 2

3

LINQはそれよりもはるかに怖いように見えます。アニルダの答えには2つのビットが使用されていますが、これについて説明します。1つ目は.Select(x=>です。これは、「リスト内のすべてのものについて、それを何かに置き換える」ことを意味します。xは、リスト内の各アイテムを表します。

例えば:

new string[]{"a", "b", "c"}.Select(x=>x.ToUpper()); 

{"a"、 "b"、 "c"}の配列を{"A"、 "B"、"C"}の配列に変換します。それはただ「リストの中のそれぞれのものを取り、それを呼び出すことによってあなたが得るものとそれを置き換える」と言っているだけですToUpper()

LINQの他のビットはです.Where(x=>。それはただ「この声明が真実であるものだけを含むより小さなリストを私にください」と言っています。それで

new string[]{"a", "b", "c"}.Where(x=>x == "a"); 

{"a"}のリストが表示されます。に置き換えるx == "a"x != "b"、{"a"、"c"}のリストが表示されます。つまり、コードの2番目のビットでは、「各アイテムを製品名に置き換える前に、一致させたいものと一致しないものをすべて除外します。次に、残っているものを変換します。 「」


これらをコード例に適用するために、行を再フォーマットしてコメントします。

// To set the first combo box:
cbProduct.Items.AddRange( // Add everything we produce from this to the cbProduct list
    doc.Descendants("items") // For each thing that represents an "items" tag and it's subtags
    .Select(x=>x.Element("productname").Value) // Transform it by getting the "productname" element and reading it's Value.
    .ToArray<string>()); // Then convert that into a string[].


// To set the second combo box:
string product2Search=cbProduct.SelectedItem.ToString();// get the currently selected value of cbProduct.
cbBrandName.Items.Clear(); //clears all items in cbBrandNamedoc
cbBrandName.Items.AddRange( // Add everything we produce from this to the cbBrandName list
  doc.Descendants("items") // For each thing that represents an "items" tag and it's subtags
  .Where(x=>x.Element("productname").Value==product2Search) // Filter our list to only those things where the productname matches what's currently selected in cbProduct (which we just stored)
  .Select(y=>y.Element("brandname").Value) // Transform it by getting the "brandname" element and reading it's Value.
  .ToArray<string>()); // Then convert that into a string[]

それは役に立ちましたか?自分でコーディングするときは、長いLINQステートメントを次のように別々の行に配置して分割するのが好きです。そうすれば、次の行を読み取ることができます。その上に、それをアレイに変えてください。」

于 2012-10-07T08:06:43.033 に答える
3

LINQ2XML

XElement doc=XElement.Load(@"..\..\stock.xml");

//put this code in the form_load event
cbProduct.Items.AddRange(doc.Descendants("items").Select(x=>x.Element("productname").Value).ToArray<string>());//adds all products

//put this code in the SelectedIndexChanged event of cbProduct
string product2Search=cbProduct.SelectedItem.ToString();//selected value of cbProduct
cbBrandNamedoc.Items.Clear(); //clears all items in cbBrandNamedoc
cbBrandNamedoc.Items.AddRange(doc.Descendants("items").Where(x=>x.Element("productname").Value==product2Search).Select(y=>y.Element("brandname").Value).ToArray<string>());
于 2012-10-06T07:36:45.600 に答える