如何构建具有未知列数的WPF数据网格

时间:2017-05-26 13:21:18

标签: c# wpf xaml datagrid

我需要从我从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:标题必须是用户必须设置的组合框

2 个答案:

答案 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;

}

结果(我输入了一些值)

datagrid

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