c# - 用作网格视图的数据源的复杂集合
问题描述
我正在反序列化XML文件中的数据,以便在 gridview 中显示数据。这是 XML 文件内容:
<Params>
<Param name="Paramètre #1">
<Value> 1.1 </Value>
<Value> 1.2 </Value>
<Value> 1.3 </Value>
</Param>
<Param name="Paramètre #2">
<Value> 2.1 </Value>
<Value> 2.2 </Value>
</Param>
<Param name="Paramètre #3">
<Value> 3.1 </Value>
<Value> 3.2 </Value>
<Value> 3.3 </Value>
<Value> 3.4 </Value>
</Param>
</Params>
我希望 gridview 像这样撕裂:
我所能做的就是:
无论参数值的数量如何,有没有办法将参数的任何值存储在列中?
这是标记:
<html lang="fr">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<form runat="server">
<asp:Label runat="server" ID="Lb" ></asp:Label>
<asp:GridView runat="server" ID="Gdv" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Parameters" DataField="Name"></asp:BoundField>
<asp:TemplateField HeaderText="Values">
<ItemTemplate>
<asp:Label ID="LbGrid" runat="server" Text="<%# GetValues(Container.DataItem) %>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</form>
</body>
</html>
这是代码隐藏:
public partial class SiteMaster : MasterPage
{
List<Param> Parameters { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(@"D:\Utilisateurs\valen\Desktop\ParamsTab\XML\Main.xml");
XmlSerializer deserializer = new XmlSerializer(typeof(List<Param>), new XmlRootAttribute("Params"));
Parameters = (List<Param>)deserializer.Deserialize(sr);
Gdv.DataSource = Parameters;
Gdv.DataBind();
sr.Close();
}
public string GetValues(object param)
{
Param parameter = (Param)param;
string values = string.Empty;
values += string.Join(",", parameter.Values);
return values;
}
}
这是用作数据源的类:
public class Param
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlElement("Value")]
public List<string> Values { get; set; }
}
解决方案
使用 xml linq。该代码是完全动态的,并创建了一个数据透视表,您可以使用它的 Grid 绑定源。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
int maxParameters = doc.Descendants("Param").Max(x => x.Elements("Value").Count());
DataTable dt = new DataTable();
dt.Columns.Add("Parameters", typeof(string));
for (int i = 1; i <= maxParameters; i++)
{
dt.Columns.Add("Value#" + i.ToString(), typeof(string));
}
foreach (XElement param in doc.Descendants("Param"))
{
List<string> row = new List<string>() { (string)param.Attribute("name")};
row.AddRange(param.Elements("Value").Select(x => (string)x));
dt.Rows.Add(row.ToArray());
}
}
}
}
推荐阅读
- java - 用 maven 包装一个 gradle 项目
- karate - 将空手道测试与 JIRA 集成
- c# - 如何使用 C# 更新密码?
- jquery - 使用 Jquery 无限加载
- reactjs - 如何在这个反应组件中居中 svg?
- azure - 如何正确设置 RDMS 外部数据源的防火墙规则
- reactjs - How to pass a function to child component as a prop?
- webots - Vehicle modelisation on WeBots
- azure - Azure IoT Hub:撤销设备会话
- postgresql - PostgreSQL 文本到 tsquery 使用管道运算符