0

これは「Buying Bills.xml」という XML ファイルで、BILLS がルートです。

    <?xml version="1.0" encoding="utf-8"?>
<BILLS>
  <BILL>
    <DATE>24/11/2013 10:55:08 ص</DATE>
    <LIST>
      <NAME>Corded Cyclonic Stick Vacuum</NAME>
      <NUMBER>2</NUMBER>
      <PRICE>159.98</PRICE>
      <NAME>Table Fan</NAME>
      <NUMBER>3</NUMBER>
      <PRICE>239.97</PRICE>
      <NAME>Kenmore Elite  31.0 cu. ft. French Door Bottom-Freezer Refrigerator</NAME>
      <NUMBER>1</NUMBER>
      <PRICE>1999.99</PRICE>
      <NAME>Electric Freestanding Range 700 Series</NAME>
      <NUMBER>1</NUMBER>
      <PRICE>1999.00</PRICE>
      <NAME>Rocky 2 Washer</NAME>
      <NUMBER>2</NUMBER>
      <PRICE>1970.00</PRICE>
    </LIST>
  </BILL>
  <BILL>
    <DATE>21/11/2013 02:09:15 ص</DATE>
    <LIST>
      <NAME>Air Steerable Bagless Upright</NAME>
      <NUMBER>3</NUMBER>
      <PRICE>569.97</PRICE>
      <NAME>Table Fan</NAME>
      <NUMBER>5</NUMBER>
      <PRICE>399.95</PRICE>
      <NAME>Kenmore  25.4 cu. ft. Side-by-Side Refrigerator</NAME>
      <NUMBER>3</NUMBER>
      <PRICE>2399.97</PRICE>
      <NAME>Electric Freestanding Range 700 Series</NAME>
      <NUMBER>2</NUMBER>
      <PRICE>3998.00</PRICE>
      <NAME>Rocky 2 Washer</NAME>
      <NUMBER>4</NUMBER>
      <PRICE>3940.00</PRICE>
    </LIST>
  </BILL>
  <BILL>
    <DATE>21/11/2013 02:03:25 ص</DATE>
    <LIST>
      <NAME>Corded Cyclonic Stick Vacuum</NAME>
      <NUMBER>3</NUMBER>
      <PRICE>239.97</PRICE>
    </LIST>
  </BILL>
  <BILL>
    <DATE>21/11/2013 01:57:55 ص</DATE>
    <LIST>
      <NAME>Quietforce Bagged Canister</NAME>
      <NUMBER>2</NUMBER>
      <PRICE>299.99</PRICE>
      <NAME>Table Fan</NAME>
      <NUMBER>5</NUMBER>
      <PRICE>79.99</PRICE>
      <NAME>Kenmore  18.2 cu. ft. Top-Freezer Refrigerator</NAME>
      <NUMBER>4</NUMBER>
      <PRICE>499.99</PRICE>
      <NAME>Electric Slide-in Range 700 Series</NAME>
      <NUMBER>7</NUMBER>
      <PRICE>2,499.00</PRICE>
      <NAME>Rocky 2 Washer</NAME>
      <NUMBER>6</NUMBER>
      <PRICE>985.00</PRICE>
    </LIST>
  </BILL>
</BILLS>

フォームに 2 つのコンボボックスがあり、それぞれに XML ファイルのすべての日付が含まれています (2 つの同一のリスト)。たとえば、comboBox1 でファイルの最初の日付を選択し、comboBox2 で最後の日付 (または 3 番目の日付など) を選択したとします。これら 2 つの日付の間からすべての価格の合計を取得するにはどうすればよいですか (選択された2つの日付の価格の合計だけでなく、その間の価格の合計も....最初の日付を含むノードXから2番目の日付を含むノードZまでのすべての価格をスイープして計算するようなものです。合計。タイトルが示すように、C# を使用します。よろしくお願いします:)

4

2 に答える 2

1

Linq を Xml に使用できます。

var xdoc = XDocument.Load(fileName);
var bills = from b in xdoc.Descendants("BILL")
            group b by (string)b.Element("DATE") into g
            select new {
                Date = g.Key,
                TotalPrice = g.Element("LIST")                              
                              .Elements("PRICE")
                              .Sum(p => (decimal)p)
            };

請求書をコンボボックスにバインドできるようになりました。Date表示メンバーおよびTotalPrice値メンバーとして使用します。または、選択した日付の合計金額を検索することもできます:

var price = bills.First(b => b.Date == date).TotalPrice;

更新: 次のクエリは、複数の日付の合計価格を返します。

string[] dates = // get selected dates
var price = bills.Where(b => dates.Contains(b.Date))
                 .Sum(b => b.TotalPrice);
于 2013-11-21T17:12:36.900 に答える
0

あなたの質問が求めているように見えるのは、コンボボックスで日付の1つを選択することです。たとえば、あなたのxmlには2つの請求書があります。リストにオブジェクトが1つしかない2番目のBillオブジェクトの日付(コンボボックスで)を選択した場合(したがって、価格は1つだけ)、その価格を取得したい場合、これが必要な場合はそれを達成できますデータバインディングの場合、大まかな例は次のとおりです。

更新: 1) フォームで bindingsource を宣言します。たとえば、次のようにします。

private BindingSource source = new BindingSource();
private BindingSource SecondSource = new BindingSource();

2)次に、フォームの読み込みにこのコードを配置します(コンボボックスとxmlファイルの名前を変更します):

var serializer = new XmlSerializer(typeof(List<Bill>));

using(var reader = new StreamReader("YourFileNameHere.xml"))
{
     try
     {
        source.DataSource = (List<Bill>)serializer.Deserialize(reader);
     }
     catch (Exception ex)
     {
        MessageBox.Show(ex.Message);
     }
}

SecondSource.DataSource = source;
comboBox1.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);
comboBox2.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);

comboBox1.DisplayMember = "Date";
comboBox2.DisplayMember = "Date";
comboBox1.DataSource = source;
comboBox2.DataSource = SecondSource;

3) 次に、選択したインデックスのイベント ハンドラーが変更されました。

void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
     var query = from combo in this.Controls.OfType<ComboBox>().Where(c => c.SelectedItem != null)
                 select ((Bill)combo.SelectedItem).Products.Sum(p => p.Price);
     textBox1.Text = query.Aggregate((d, a) => d + a).ToString();
}

4) もう 1 つ、あなたの xml では、Bill クラスに属性を追加してより適切にフォーマットすることをお勧めします。Bill クラスに日付とリストの 2 つのメンバーしかないと仮定すると、次はより構造化された xml を生成します。

[Serializable]
[XmlRootAttribute(IsNullable = false, ElementName = "Bills",Namespace ="")]
public class Bill
{
    [XmlElement("Date")]
    public DateTime Date {get;set;}

    [XmlArray(ElementName = "Products")]
    public List<Product> Products { get; set; }
}

そして、コンボボックスで異なる日付を選択するたびに、その Bill インスタンスに関連するすべての価格の合計が得られます。

于 2013-11-22T00:05:34.730 に答える