【发布时间】:2021-11-03 06:29:19
【问题描述】:
我想在 DataGrid 中水平显示List<int> 的每个元素。
我的数据如下所示:
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 }));
List<int> 的元素应该被分成三个部分,每个元素应该在一个 DataGrid 单元格中水平显示:
1 AA 1 2 3
2 BB 4 5 6
3 CC 7 8 9
现在它只显示(Collection)。
我想我需要处理 XAML,但我找不到任何示例。
This question 与我的类似,但解决方案与我想要的不同。 我宁愿将列分成三部分,并将它们分别分配给一个单元格。
顺便说一句,引入List<int> 的目的是显示任意数量的元素。您可以假设所有行的长度完全相同,例如,如果第 1 行有 7 个元素,则所有其他行(这次是第 2 行和第 3 行)也有 7 个元素。
这是我的代码:
CatModel.cs
using System;
using System.Collections.Generic;
namespace WpfApp1
{
public class CatModel
{
//public CatModel(int Num, String Name, int Test_0001, int Test_0002, int Test_0003)
public CatModel(int Num, String Name, List<int> Test_List)
{
this.Num = Num;
this.Name = Name;
//this.Test_0001 = Test_0001;
//this.Test_0002 = Test_0002;
//this.Test_0003 = Test_0003;
this.Test_List = Test_List;
}
public int Num { get; set; }
public String Name { get; set; }
//public int Test_0001 { get; set; }
//public int Test_0002 { get; set; }
//public int Test_0003 { get; set; }
public List<int> Test_List { get; set; }
}
}
MainWindow.xaml.cs
using System.Collections.Generic;
using System.Windows;
namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<CatModel> result = new List<CatModel>();
//result.Add(new CatModel(1, "AA", 1, 2, 3));
//result.Add(new CatModel(2, "BB", 4, 5, 6));
//result.Add(new CatModel(3, "CC", 7, 8, 9));
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 }));
this.dataGrid.ItemsSource = 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 AutoGenerateColumns="False" Name="dataGrid" HorizontalAlignment="Left" Margin="10,10,10,10">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Num}" ClipboardContentBinding="{x:Null}" Header="Num" IsReadOnly="True" Width="50"/>
<DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Name" IsReadOnly="True" Width="100"/>
<DataGridTextColumn Binding="{Binding Test_0001}" ClipboardContentBinding="{x:Null}" Header="Test_0001" IsReadOnly="True" Width="*"/>
<DataGridTextColumn Binding="{Binding Test_0002}" ClipboardContentBinding="{x:Null}" Header="Test_0002" IsReadOnly="True" Width="*"/>
<DataGridTextColumn Binding="{Binding Test_0003}" ClipboardContentBinding="{x:Null}" Header="Test_0003" IsReadOnly="True" Width="*"/>
<DataGridTextColumn Binding="{Binding Test_List}" ClipboardContentBinding="{x:Null}" Header="Test_List" IsReadOnly="True" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
【问题讨论】:
-
最简单和最常见的解决方案是将“列表列表”替换为 DataTable。
-
@EldHasp 老实说,我已经尝试过 DataTable,但我遇到了问题。 已编辑问题是:
(Collection)仍然显示,即使我设置了AutoGenerateColumns="True"。 -
你误解了我的意思。我并不是想用 DataTable 替换 CatModel.List。您需要使用 DataTable 而不是
result。在 DataTable 中,创建所需的列,包括每个工作表值的一列。 -
@EldHasp 首先,感谢您的回答。它完美地工作。其次,对于您的评论,让我在新线程中将其作为另一个问题提出(因为在这里很难阅读我的代码)。
-
我会尝试在新线程中给出答案。