我需要从我从txt获得的字符串数组的集合中构建和显示WPF数据网格。问题是我不知道先验的是列数,即单个数组中的项目数。所以我在我的xaml <DataGrid Grid.Row="2" ItemsSource="{Binding Path=Rows}" />
我试图在我的视图模型中填充它,但我不能简单地将我的数组(Observable Collection)数组作为项目源,因为数据网格只显示空行。
我也可以使用其他方法而不是Observable集合,因为我使用相同的方法生成我的数组
这是我的Observable Collection:
ObservableCollection<string[]> Rows = new ObservableCollection<string[]>;
在这个方法中我填写了集合
foreach(ListViewItem item in wsettings.lista)
{
TextBlock line = item.Content as TextBlock;
string txt = line.Text;
string[] x = txt.Split(stringSeparators, StringSplitOptions.None);
Rows.Add(x);
}
请不要介意分手前的第一部分。我从我之前使用的文本块的列表视图中获取数据(我有我的理由)。
EDIT1:使代码更具可读性
EDIT2:标题必须是用户必须设置的组合框
答案 0 :(得分:1)
.Net中有DataTable
class。它的主要目的是与关系数据库进行通信,但它可以很好地用于存储,显示和编辑表格数据(例如,在wpf,WORKDIR = "Z:\BackOrder Reports"
DESKTOP = 'c:' + os.environ['HOMEPATH'] + "\Desktop"
os.chdir(DESKTOP)
Firstdate = raw_input("Set first date range Note: Format YYYY-MM-DD:")
if len(Firstdate) > 0:
True
else:
print 'test break 1'
Seconddate = raw_input("Set second date range Note: Format YYYY-MM-DD:")
if len(Seconddate) > 0:
True
else:
print 'test break 2'
name = "Number of backorders %s through %s" % (Firstdate, Seconddate)
中读取和显示.csv / Excel文件 - &gt; DataTable + DataGrid
的WinForms)。
DataTable列(DataColumn)可以在运行时添加/删除,DataGrid为它们自动生成列(DataGridColumn)(默认情况下启用),使用标题的Name属性。 DataTable也支持开箱即用的排序和过滤。
注意:分配新的ItemsSource时,DataGrid不会清除DataTable + DataGridView
。因此,可以使用一些预定义的列并使用自动生成。
注意:DataGrid默认创建Columns
。如果需要更复杂的模板,则可以通过DataGridTextColumn
事件(see example)拦截该过程
这是一个例子:
码
AutoGeneratingColumn
XAML
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;
}
结果(我输入了一些值)
答案 1 :(得分:0)
如果您在编译时不知道列数,则需要以编程方式创建列。这在视图中应该非常简单。以下示例代码应该提供您的想法:
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;
}