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>

我的表单上有两个组合框,每个组合框都包含我的 XML 文件中的所有日期(2 个相同的列表)。假设在 comboBox1 中我选择了文件中的第一个日期,而在 comboBox2 中我选择了最后一个日期(或者可能是第三个......无论如何),我怎样才能从这两个日期之间获得所有价格的总和(不仅两个选定日期价格的总和,但也是两者之间价格的总和)......这就像从包含第一个日期的节点 X 到包含第二个日期的节点 Z 扫描所有价格并计算总和。正如标题所说,使用 C#。在此先感谢各位:)

4

2 回答 2

1

您可以使用 Linq to 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

您的问题似乎是在选择组合框中的一个日期,您希望将相应列表的价格相加,其中包含我猜想的类型的对象,例如 Product 或类似的东西,例如,在您的 xml 中有 2 Bill对象,如果您选择了列表中只有 1 个对象(因此只有 1 个价格)的第二个 Bill 对象的日期(在组合框中),您想获得该价格,如果这是您需要的,那么您可以实现它使用数据绑定,一个粗略的例子如下:

更新:1)在您的表单中声明一个绑定源,例如:

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)还有一件事,通过你的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 回答