C# 如何用XElement/XAttribute填充数据表?

C# 如何用XElement/XAttribute填充数据表?,c#,winforms,datatable,C#,Winforms,Datatable,我是C#的新手,以前从未使用过数据表 我想要一个具有特定名称的DataGridView DataTable table = new DataTable(); List<string> bla = new List<string>(); XDocument config = XDocument.Load(configFile); Dictionary<string, string> dict =

我是C#的新手,以前从未使用过数据表

我想要一个具有特定名称的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);
            }
DataTable=newdatatable();
List bla=新列表();
XDocument config=XDocument.Load(配置文件);
Dictionary dict=config.substands(“Columns”).FirstOrDefault().Elements()
.GroupBy(x=>(字符串)x.Attribute(“XPath”),y=>(字符串)y.Attribute(“名称”))
.ToDictionary(x=>x.Key,y=>y.FirstOrDefault());
//我不知道我是否需要这个:
foreach(dict.Keys中的字符串键)
{
table.Columns.Add(key,typeof(string));
}
foreach(positions.Where(e=>e.HasAttributes)中的元素位置)
{
foreach(position.Attributes()中的XAttribute属性,其中(a=>dict.ContainsKey($“@{a.Name.LocalName}”))
{
字符串名称=attribute.name.LocalName;
字符串值=(字符串)属性;
字符串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]);
                //}
            }
foreach(bla中的var项)
{
DataRow行=table.NewRow();
row.SetField(item);//这不起作用。
//foreach(dict.Keys中的字符串键)
//{
//行设置字段(键,项[键]);
//}
}
只需要将xName中的名称作为我的输出标题

für xName示例:位置、状态、订单、编号。。。 作为我的标题。
在这下面是值。

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

下面是如何使用特定列标题名称向datatable添加列和行的示例

正如在评论中所讨论的,我已经演示了一个将所需数据导入结构的过程,该结构允许您填充表

      //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);
        }
//用于保存数据的类
公共类MyRecordContent
{
公共MyRecordContent()
{
//初始化列表
RecordsColumns=新列表();
}
//保存记录每列的字符串列表。
//它从位置0开始,以显示您有多少列
公共列表记录列{get;set;}
}
//这将创建一个包含列的空表
var myTable=新数据表(“表1”);
foreach(bla中的var项目)
{
如果(!myTable.Columns.Contains(项))
{
添加(新的数据列(item,typeof(string));
}
}
//在这里,您可以根据xml建立所有记录及其字段内容的列表。
foreach(XmlRecordCollection中的var xmlNode)
{
var thisRecord=新的MyRecordContent();
foreach(xmlNode.Elements中的var xmlCol)//每个列的值
{
thisRecord.RecordsColumns.Add(xmlCol.GetValue());
}
添加(此记录);
}
foreach(myListOfRecords中的MyRecordContent记录)
{
var row=myTable.NewRow();
//在这里,我们在datatable中设置每一行和每一列的值。
//将每个行列值映射为列表中相同位置的值。

对于(var colPosition=0;colPosition啊,谢谢!是的,我不知道如何创建具有正确列名的datatable.。但是对于
“MyColumnName”
我应该选择
还是不选择?否则它会说“column”…“不属于表”?@Lizzy-是。如果项是字符串列名,则替换“MyColumnName”关于item.Allright.,
“FieldValue”
有什么用?这说明了什么?还有另一个问题:我有更多的xName具有相同的名称,但不同的值..所以它说“列已经存在”。@Lizzy-“FieldValue”正在向您展示如何为当前行设置列的值。因此,请将该文本替换为该字段中应有的文本。理想情况下,您需要创建一个唯一的列名列表以防止重复。但是您可以进行检查,以便我将其添加到我的答案中。谢谢,这很有效!!:)因此在
行[标题]=“FieldValue”
我必须把另一个foreach.的
放在这里。但是我无法访问该值。嗯..我该怎么做?