首页 > 解决方案 > 用作网格视图的数据源的复杂集合

问题描述

我正在反序列化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; }
}

标签: c#asp.netxmlgridview

解决方案


使用 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());
            }

        }
    }
}

推荐阅读