簡體   English   中英

如何用XElement / XAttribute填充數據表?

[英]How to fill a DataTable with XElement/XAttribute?

我是C#的新手,之前從未使用過DataTable。

我想要一個具有特定名稱的DataGridView。

        DataTable table = new DataTable();
        List<string> bla = new List<string>();

        XDocument config = XDocument.Load(configFile);

        Dictionary<string, string> dict = config.Descendants("Columns").FirstOrDefault().Elements()
            .GroupBy(x => (string)x.Attribute("XPath"), y => (string)y.Attribute("Name"))
            .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        //I dont know if I need this:
        foreach (string key in dict.Keys)
        {
            table.Columns.Add(key, typeof(string));
        }


        foreach (XElement position in positions.Where(e => e.HasAttributes))
        {
            foreach (XAttribute attribute in position.Attributes().Where(a => dict.ContainsKey($"@{a.Name.LocalName}")))
            {
                string name = attribute.Name.LocalName;
                string value = (string)attribute;
                string xName = dict["@" + name];

                bla.Add(xName);
            }

這些列的名稱應來自xName。

我怎樣才能做到這一點?

我已經試過了:

            foreach (var item in bla)
            {
                DataRow row = table.NewRow();
                row.SetField<string>(item); //this didn't work.

                //foreach (string key in dict.Keys)
                //{
                //    row.SetField<string>(key, item[key]);
                //}
            }

只希望xName中的名稱作為我的輸出標題。

xName示例:頭寸,狀態,訂單,編號,...作為我的標題。 並根據該值。

如果我正確理解您的意思,您就可以使用列名列表,但是不知道如何使用正確的列名創建數據表。

以下是如何使用特定的列標題名稱向數據表添加列和行的示例。

正如評論中所討論的那樣,我已經演示了一種將所需數據放入允許您填充表的結構中的過程。

      //Class to hold data
  public class MyRecordContent
  {
        public MyRecordContent()
        {
            //initialise list
            RecordsColumns = new List<string>();
        }

        //Holds a list of strings for each column of the record.
        //It starts at position 0 to however many columns you have
        public List<string> RecordsColumns { get; set; }
  }

            //This creates an empty table with the columns
            var myTable = new DataTable("Table1");
            foreach (var item in bla)
            {
                if (!myTable.Columns.Contains(item))
                {
                    myTable.Columns.Add(new DataColumn(item, typeof(string)));
                }
            }



         //Here you build up a list of all records and their field content from your xml.
        foreach (var xmlNode in yourXMLRecordCollection)
        {
            var thisRecord = new MyRecordContent();

            foreach (var xmlCol in xmlNode.Elements)//Each column value
            {
                thisRecord.RecordsColumns.Add(xmlCol.GetValue());
            }

            myListOfRecords.Add(thisRecord);
        }

        foreach (MyRecordContent record in myListOfRecords)
        {
            var row = myTable.NewRow();

            //Here we set each row column values in the datatable.
            //Map each rows column value to be the value in the list at same position.
            for (var colPosition = 0; colPosition <= myTable.Columns.Count - 1;) //Number of columns added.
            {
                row[colPosition] = record.RecordsColumns[colPosition];
            }

            myTable.Rows.Add(row);
        }

在上面的內容中,遍歷您的列名稱列表,並將每列添加到表中。 您可能需要在循環中添加switch語句,以根據名稱更改列的數據類型。 然后在該表上創建新行,並相應地設置每個字段的值。 最后,將新行添加到數據表中。

希望能有所幫助。

然后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM