Сложная коллекция для использования в качестве источника данных для вида сетки - PullRequest
0 голосов
/ 09 февраля 2020

Я десериализирую данные из файла XML, чтобы отобразить данные в виде сетки. Вот содержимое файла 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>

Я бы хотел, чтобы представление сетки отображалось так:

Expected result

Все, что я смог сделать это:

Actual result

Есть ли способ сохранить любое значение параметра в столбце независимо от количества значений параметра?

Здесь Разметка :

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

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Используйте xml linq. Код полностью динамический c и создает сводную таблицу, которую вы можете использовать в качестве источника привязки вашей таблицы.

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

        }
    }
}
0 голосов
/ 17 февраля 2020

Во-первых, большое спасибо за ответ. Все ваши решения хорошо работают для Datagrid. Но не в случае Gridview. На самом деле я продолжил поиск и обнаружил, что мне просто нужно добавить ItemTemplate в коде. Я еще не нашел, как это сделать, поэтому, если у вас есть решение, я был бы рад принять его. Спасибо всем

0 голосов
/ 09 февраля 2020

Похоже, вы хотите один столбец для каждого значения. Но в вашем коде вы создаете только один столбец для всех значений.

Если вы не знаете количество параметров в файле XML, вы должны сделать эту динамику c. Посмотрите Заполнение таблицы данных с помощью динамических c Столбцов , чтобы узнать, как это сделать.

Если у вас никогда не бывает более 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>

...