C# 如何构建列数未知的WPF数据网格
我需要从一个txt文件中获取的字符串数组集合中构建和显示一个WPF数据网格。问题是我不知道一个先验的列数,即单个数组中的项数。所以我在我的xamlC# 如何构建列数未知的WPF数据网格,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我需要从一个txt文件中获取的字符串数组集合中构建和显示一个WPF数据网格。问题是我不知道一个先验的列数,即单个数组中的项数。所以我在我的xaml 我试图在视图模型中填充它,但我不能简单地将数组的集合(可观察集合)作为项源,因为datagrid将只显示空行 我还可以在可观察集合上使用其他方法,因为我使用相同的方法生成数组 这是我的可观察收藏: ObservableCollection<string[]> Rows = new ObservableCollection<strin
我试图在视图模型中填充它,但我不能简单地将数组的集合(可观察集合)作为项源,因为datagrid将只显示空行
我还可以在可观察集合上使用其他方法,因为我使用相同的方法生成数组
这是我的可观察收藏:
ObservableCollection<string[]> Rows = new ObservableCollection<string[]>;
请不要介意分开前的第一部分。我从以前使用的文本块列表视图中获取数据(我有我的理由)
EDIT1:使代码更具可读性
EDIT2:标题必须是用户必须设置的组合框如果您不知道编译时的列数,则需要以编程方式创建列。在视图中,这应该是非常直接的。下面的示例代码应该能让您了解这一点:
public MainWindow()
{
InitializeComponent();
var viewModel = new ViewModel();
var rows = viewModel.Rows;
int numberOfColumns = rows[0].Length; //assume all string[] have the same length
DataContext = new VM1();
for (int i = 0; i < numberOfColumns; ++i)
{
dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() });
}
dataGrid1.ItemsSource = rows;
}
public主窗口()
{
初始化组件();
var viewModel=新的viewModel();
var rows=viewModel.rows;
int numberOfColumns=行[0].Length;//假设所有字符串[]的长度相同
DataContext=newVM1();
对于(int i=0;i
在.Net中没有。它的主要用途是与关系数据库通信,但可以很好地用于存储、显示和编辑表格数据(例如,在wpf中读取和显示.csv/Excel文件->DataTable+DataGrid
,在WinForms中读取和显示.csv/Excel文件->DataTable+DataGrid
)
DataTable列(DataColumn)可以在运行时添加/删除,DataGrid使用标题的Name属性自动为它们生成列(DataGridColumn)(默认情况下启用)。DataTable还支持开箱即用的排序和筛选
注意:当分配新的ItemsSource时,DataGrid不会清除列
。因此,可以有一些预定义的列并使用autogenerate
注意:默认情况下,DataGrid创建DataGridTextColumn
s。如果需要更复杂的模板,可以通过AutoGeneratingColumn
event()截取流程
以下是一个例子:
代码
xaml
结果(我输入了一些值)
你不应该用文本块做这些奇怪的事情。您应该只将ItemsSource绑定到viewmodel中的ObservableCollection,就像您尝试的那样。如果您向我们展示您尝试使用这种方式时所使用的所有代码,我们可以帮助您正确操作。您希望得到哪些列标题?@Daniele,您可以使用
DataTable
存储值并以DataGrid@ASh你能解释一下怎么做吗?我已经创建了一个数据表,并填充了我的数据。我修改了我的xamul,如下所示:但我的数据网格仍然是空的。测试是我的数据表。我甚至尝试将我的datatable保存为DataView,但没有results@DanieleSartori,AutoGenerateColumns
应该是True
并且ItemsSource
需要IEnumerable(dataTable.DefaultView,ItemsSource=“{Binding Path=DefaultView}”
),这肯定是一个解决方案。我只想在视图模型中这样做视图模型不应该负责创建DataGrid列。这将打破MVVM模式。这是属于视图的基于视图的功能。VM只是公开一个集合供视图绑定。@mm8您如何将集合与绑定联系起来?
public MainWindow()
{
InitializeComponent();
var viewModel = new ViewModel();
var rows = viewModel.Rows;
int numberOfColumns = rows[0].Length; //assume all string[] have the same length
DataContext = new VM1();
for (int i = 0; i < numberOfColumns; ++i)
{
dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() });
}
dataGrid1.ItemsSource = rows;
}
public class MyViewModel
{
public DataTable Test { get; set; }
}
public MyWindow()
{
InitializeComponent();
var vm = new MyViewModel
{
Test = new DataTable
{
Columns = {"A", "B", "C"}
}
};
this.DataContext = vm;
}
<DataGrid AutoGenerateColumns="True"
ItemsSource="{Binding Path=Test.DefaultView}">
<DataGrid.Columns>
<DataGridTextColumn Header="#"/>
</DataGrid.Columns>
</DataGrid>