如何使用XElement / XAttribute填充DataTable?

时间:2018-04-09 08:02:06

标签: c# winforms datatable

我是C#的新手,我之前从未使用过DataTable。

我想要一个具有特定名称的DataGridView。

conda env update -f file.yml --prune

列应具有 xName。

的名称

我该怎么做?

我试过这个:

        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 中的名称作为输出的标题。

示例fürxName:位置,状态,订单,编号,... 作为我的标题。 在那个价值观之下。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你的列名列表可以,但不知道如何使用正确的列名创建数据表。

下面是如何将列和行添加到具有特定列标题名称的数据表的示例。

正如评论中所讨论的,我已经展示了一个过程,可以将您需要的数据导入到允许您填充表格的结构中。

      //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语句,以根据需要更改列的数据类型。然后从该表创建新行并相应地设置每个字段值。 最后,将新行添加到数据表中。

希望有所帮助。

然后