我是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)
.............(所有价值观)
答案 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中看到预期标题文本的列。