将多个行值从数据库传递到XML

我想以fllowing格式生成一个xml文件。

  AutoCount Accounting 1.5 BApp Business Solutions  XXX 2 6.00   YYY 3 50.00   

我有一个网格有四列Docno,item,qty,price和两行数据。 但我只得到一个销售节点,其中包含网格中的最后一行数据。

我试过的代码如下,

  string PATH = "C:\\Samplex.xml"; CreateEmptyFile(PATH); var data = new AutoCount(); data.Product = "AutoCount Accounting"; data.Version = "1.5"; data.CreatedApplication = "BApp"; data.CreatedBy = "Business Solutions"; data.CreatedDateTime = DateTime.Now; for (int i = 0; i < dataGridView1.RowCount - 1; i++) { var sales = new SalesInvoice(); data.SalesInvoice = new[] { sales }; sales.DocNo = dataGridView1.Rows[i].Cells[0].FormattedValue.ToString(); sales.Item = dataGridView1.Rows[i].Cells[1].FormattedValue.ToString(); sales.Qty = dataGridView1.Rows[i].Cells[2].FormattedValue.ToString(); sales.Price = dataGridView1.Rows[i].Cells[3].FormattedValue.ToString(); var serializer1 = new XmlSerializer(typeof(SalesInvoice)); } var serializer = new XmlSerializer(typeof(AutoCount)); using (var stream = new StreamWriter(PATH)) serializer.Serialize(stream, data); 

产量是:

    AutoCount Accounting 1.5 BApp Business Solutions  YYY 3 50.00   

除其他问题外,主要问题在于:

 data.SalesInvoice = new[] { sales }; 

您可以在evey循环循环中从头开始创建SalesInvoice数组,而不是在循环之前创建它并在其中添加元素。

这是我将如何做(请看变量名称):

 //Plural as it is a list List salesInvoices = new List(); for (int i = 0; i < dataGridView1.RowCount - 1; i++) { //Singular as it is a single element var salesInvoice = new SalesInvoice(); salesInvoice.DocNo = dataGridView1.Rows[i].Cells[0].FormattedValue.ToString(); salesInvoice.Item = dataGridView1.Rows[i].Cells[1].FormattedValue.ToString(); salesInvoice.Qty = dataGridView1.Rows[i].Cells[2].FormattedValue.ToString(); salesInvoice.Price = dataGridView1.Rows[i].Cells[3].FormattedValue.ToString(); salesInvoices.Add(salesInvoice); //What's the purpose of the next line? var serializer1 = new XmlSerializer(typeof(SalesInvoice)); } // I pluralized this property name too data.SalesInvoices = salesInvoices.ToArray(); 

使用DataSet / DataTable,程序变得微不足道。 向表单添加两个datagridviews。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { const string FILENAME = @"c:\temp\test.xml"; AutoCount autoCount = new AutoCount(); public Form1() { InitializeComponent(); autoCount.ds.WriteXml(FILENAME, XmlWriteMode.WriteSchema); dataGridView1.DataSource = autoCount.ds.Tables["AutoCount"]; dataGridView2.DataSource = autoCount.ds.Tables["Sales"]; } public class AutoCount { public DataSet ds {get; set;} public AutoCount() { ds = new DataSet(); DataTable autoCount = new DataTable("AutoCount"); ds.Tables.Add(autoCount); DataTable sales = new DataTable("Sales"); ds.Tables.Add(sales); autoCount.Columns.Add("Product", typeof(string)); autoCount.Columns.Add("Version", typeof(string)); autoCount.Columns.Add("CreatedApplication", typeof(string)); autoCount.Columns.Add("CreatedBy", typeof(string)); autoCount.Rows.Add(new string[] { "AutoCount Accounting", "1.5", "BApp", "Business Solutions" }); sales.Columns.Add("DocNo", typeof(string)); sales.Columns.Add("Item", typeof(string)); sales.Columns.Add("Qty", typeof(int)); sales.Columns.Add("Price", typeof(double)); sales.Rows.Add(new object[] { "S0001", "XXX", 2, 6.00 }); sales.Rows.Add(new object[] { "S0002", "YYY", 3, 50.00 }); } } } }