如何使用列表中的单词命名DGV的列?

时间:2018-04-06 08:53:07

标签: c# winforms datagridview

我是C#的新手。

我有2个xml文件。 我希望结果显示在DataGridView中。因为它是一张桌子。

问题是,DGV将名称(来自我的班级)作为DGV的头条新闻。但我希望DGV将我的功能代码中的 xnames 作为头条新闻。

我的课程:

public class ResultNames
{
    public string Name { get; set; }
    public string Value { get; set; }
}

我的功能代码:

class FindFileContent
{
    public List<List<ResultNames>> GetInfos(string configFile, string dataFile)
    {
        //List<ResultNames> dataResult = new List<ResultNames>();
        List<List<ResultNames>> virtualTable = new List<List<ResultNames>>();

        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());

        XDocument data = XDocument.Load(dataFile);

        List<XElement> positions = data.Descendants("Position").ToList();

        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];

                //dataResult.Add(new ResultNames() { Name = xName, Value = value });
                virtualTable.Add(new List<ResultNames>());
                virtualTable.Last().Add(new ResultNames() { Name = xName, Value = value });

            }
        }
        return virtualTable;
  }

在这里,我想要 xName 作为标题,并将值作为右侧标题下的值。

在这里我的外出:

FindFileContent fileContent = new FindFileContent();

private void btnStart_Click(object sender, EventArgs e)
{
    List<List<ResultNames>> resultOfFiles = fileContent.GetInfos(configFile, file);

    dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    dataGridView1.AutoGenerateColumns = true;
    dataGridView1.DataSource = resultOfFiles;         
}

如您所见,我已经尝试了列表中的列表..但这也没有用..有人可以帮助我吗?

这是来自第一个xml的短xml。从这里我想要DGV 位置,Gruppen-Nr,PositionsNr,.... 作为列的标题。 那些东西在我的列表中,带有 xName 。只想在DGV中获取这些内容。

<ROOT>
 <Columns BaseXPath="//Orders/Position/">
  <Colum XPath="@PositionSK" Name="Position"/>
  <Colum XPath="@PosGroup" Name="Gruppen-Nr"/>
  <Colum XPath="@PosNumber" Name="PositionsNr"/>
  <Colum XPath="@PositionCommercialTypeSK" Name="Status"/>
  <Colum XPath="@BundlePositionSK" Name="BundlePositionSK"/>
  <Colum XPath="@MainPositionSK" Name="MainPositionSK"/>
  <Colum XPath="@SalesAgentPrice" Name="Preis"/>
  <Colum XPath="@BookingUnitSK" Name="Buch"/>
  <Colum XPath="@ContentComponentCommSK" Name="IKO"/>
  <Colum XPath="@PositionTypeSK" Name="PositionsTyp"/>
  <Colum XPath="//Advertisement[@AdvertisementSK = 
   PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementSK" 
   Name="AdvertisementSK"/>
  <Colum XPath="//Advertisement[@AdvertisementSK = 
   PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementTypeSK" 
   Name="Formatvorgabe"/>
 </Columns>
</ROOT>

它应该是这样的:

职位| Gruppen-Nr | PositionsNr |状态| ...(所有xName)

.............(所有价值观)

1 个答案:

答案 0 :(得分:1)

您应首先使用包含列定义的文件创建DataTable。然后从包含数据的文件中将数据加载到DataTable。然后将DataTable设置为DataSource的<{1}}:

DataGridView

在包含//Create DataTable having desired columns var columnsXml = XDocument.Load(@"d:\columns.xml"); var columns = columnsXml.Root.Element("Columns").Elements() .Select(x => new DataColumn(x.Attribute("Name").Value)); var dt = new DataTable(); dt.Columns.AddRange(columns.ToArray()); //Then load data to DataTable //here is some dummy data dt.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); dt.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); //Set DataSource of DataGridView this.dataGridView1.DataSource = dt; 的表单中运行上面的代码,您将在DataGridView中看到预期标题文本的列。