Home > Software design >  How to display List<int> in DataTable horizontally?
How to display List<int> in DataTable horizontally?

Time:09-17

This question relates to my previous question. In the previous question, thanks to @EldHasp, I was able to show arbitrarily many elements of List<int> in DataGrid.
Now, I'd like to do the same thing in DataTable.

I already tried it; however, it shows only System.Collections.Generic.List 1[System.In32]. I'm sure I'm wrong, but I don't know how to fix this. Although I thought AutoGenerateColumns="True" would fix this automagically, it didn't happen.

Here's my code:

CatModel.cs (The same as the previous one except the comment-outs)

using System;
using System.Collections.Generic;

namespace WpfApp1
{
    public class CatModel
    {
        public CatModel(int Num, String Name, List<int> Test_List)
        {
            this.Num = Num;
            this.Name = Name;
            this.Test_List = Test_List;
        }
        public int Num { get; set; }
        public String Name { get; set; }
        public List<int> Test_List { get; set; }
    }
}

MainWindow.xaml.cs

using System.Collections.Generic;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable result = new DataTable();

            result.Columns.Add("Num");
            result.Columns.Add("Name");
            for (int i = 0; i < 3; i  )
            {
                result.Columns.Add("Test_"   (i   1));
            }

            result.Rows.Add(1, "AA", new List<int> { 1, 2, 3 });
            result.Rows.Add(2, "BB", new List<int> { 4, 5, 6 });
            result.Rows.Add(3, "CC", new List<int> { 7, 8, 9 });

            DataContext = result;
        }
    }
}

MainWindow.xaml

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="List" Height="350" Width="750"
        BorderThickness="1">

    <Grid Width="700" Height="300">
        <DataGrid IsReadOnly="True" AutoGenerateColumns="True" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,10,10,10"/>
    </Grid>
</Window>

CodePudding user response:

An example of a possible implementation:

    public DataTable Table { get; }  = new DataTable();
    public MainWindow()
    {
        List<CatModel> result = new List<CatModel>();
        result.Add(new CatModel(1, "AA", new List<int> { 1, 2, 3 }));
        result.Add(new CatModel(2, "BB", new List<int> { 4, 5, 6 }));
        result.Add(new CatModel(3, "CC", new List<int> { 7, 8, 9 }));

        Table.Columns.Add(new DataColumn(nameof(CatModel.Num), typeof(int)));
        Table.Columns.Add(new DataColumn(nameof(CatModel.Name), typeof(string)));
        for (int i = 0; i < 3; i  )
        {
            Table.Columns.Add(new DataColumn ($"{i}", typeof(int)));
        }

        foreach (var cat in result)
        {
            var row = Table.NewRow();
            row[0] = cat.Num;
            row[1] = cat.Name;

            for (int i = 0; i < 3; i  )
            {
                row[2   i] = cat.Test_List[i];
            }

            Table.Rows.Add(row);
        }

        InitializeComponent();
    }
<Window x:Class="WpfApp1.MainWindow"
        x:Name="mainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="List" Height="350" Width="750"
        BorderThickness="1">

    <Grid Width="700" Height="300">
        <DataGrid IsReadOnly="True" AutoGenerateColumns="True"
                  ItemsSource="{Binding Table, ElementName=mainWindow}"
                  HorizontalAlignment="Left" Margin="10,10,10,10"/>
    </Grid>
</Window>

P.S. The result collection is superfluous.
I left it only because of the connection with the code in the question, so that it would be clearer how the table cells are linked with the original data.
Better to initialize the table right away without an intermediate collection.

  • Related