C# 用作gridview数据源的复杂集合

C# 用作gridview数据源的复杂集合,c#,asp.net,xml,gridview,C#,Asp.net,Xml,Gridview,我正在反序列化XML文件中的数据,以便在gridview中显示数据。 以下是XML文件内容: <Params> <Param name="Paramètre #1"> <Value> 1.1 </Value> <Value> 1.2 </Value> <Value> 1.3 </Value> </Param> <Param nam

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

1.1
1.2
1.3
2.1
2.2
3.1
3.2
3.3
3.4
我希望gridview像这样撕裂:

<asp:GridView runat="server" ID="Gdv" AutoGenerateColumns="false" ItemType="Param">
<Columns>
    <asp:BoundField HeaderText="Parameters" DataField="Name" />
    <asp:TemplateField HeaderText="Value#1">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(0) %></ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Value#2">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(1) %></ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Value#3">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(2) %></ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Value#4">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(3) %></ItemTemplate>
    </asp:TemplateField>
</Columns>

我所能做的就是:

有没有一种方法可以将参数的任何值存储在列中,而不管参数值的数量是多少

以下是标记

<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;
    }
}
公共部分类SiteMaster:母版页
{
列出参数{get;set;}
受保护的无效页面加载(对象发送方、事件参数e)
{
StreamReader sr=新的StreamReader(@“D:\usilisateurs\valen\Desktop\ParamsTab\XML\Main.XML”);
XmlSerializer反序列化器=新的XmlSerializer(typeof(List),新的XmlRootAttribute(“Params”);
参数=(列表)反序列化器。反序列化(sr);
Gdv.DataSource=参数;
Gdv.DataBind();
高级关闭();
}
公共字符串GetValues(对象参数)
{
Param参数=(Param)Param;
字符串值=string.Empty;
values+=string.Join(“,”,parameter.values);
返回值;
}
}
下面是用作数据源的类:

public class Param
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlElement("Value")]
    public List<string> Values { get; set; }
}
公共类参数
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“值”)]
公共列表值{get;set;}
}

看起来您希望每个值对应一列。但在代码中,您只为所有值创建一列

如果不知道XML文件中的参数数量,则必须使其成为动态的。 看看如何做到这一点

如果您的参数从未超过4个,那么最简单的解决方案可能是对4列进行硬编码,如下所示:

<asp:GridView runat="server" ID="Gdv" AutoGenerateColumns="false" ItemType="Param">
<Columns>
    <asp:BoundField HeaderText="Parameters" DataField="Name" />
    <asp:TemplateField HeaderText="Value#1">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(0) %></ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Value#2">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(1) %></ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Value#3">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(2) %></ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Value#4">
        <ItemTemplate><%# Item.Values?.ElementAtOrDefault(3) %></ItemTemplate>
    </asp:TemplateField>
</Columns>


使用xml linq。该代码是完全动态的,并创建了一个透视表,您可以在网格的绑定源中使用该透视表

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

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
int maxParameters=doc.substands(“Param”).Max(x=>x.Elements(“Value”).Count());
DataTable dt=新的DataTable();
添加(“参数”,类型(字符串));
对于(int i=1;i(string)x));
Add(row.ToArray());
}
}
}
}

首先,非常感谢您的回复。 您的所有解决方案都适用于Datagrid。但对于Gridview,情况并非如此。 实际上,我继续搜索,发现我只需在代码中添加ItemTemplate。我还不知道怎么做,所以如果你有解决办法,我很乐意接受。 谢谢大家