在datagrid中创建多个列

时间:2014-01-15 22:13:26

标签: wpf

我正在寻找帮助将数据绑定到WPF的datagrid。我曾经有两个双数组(t []和a_scaled []),并能够使用下面的代码将这两个数组绑定到datagrid。从每个文本文件中读取每个数组。

现在我想修改此代码以在多列中显示多个数组。数组的总数取决于最终用户选择的内容。例如,如果用户从openfile对话框中选择4个文件,则每个文件中的四个数组将显示在datagrid上。谢谢你的帮助,

c#:

        private void openfile_Click(object sender, RoutedEventArgs e)
        {

            for (int i = 1; i < t.Length; i++)
            {
                tvsa.Add(new TvsA() { T = t[i], Acc = a_scaled[i] });
             }

             datagrid_accs.ItemsSource = tvsa;

        public class TvsA
         {
           public double T { get; set; }
           public double Acc { get; set; }
         }

XAML:

<Border BorderThickness="2" Margin="1">
        <StackPanel  Width="auto" Margin="10" >
            <Label Content="Target ARS Input:" FontWeight="Bold" />
            <ScrollViewer Height="auto" Width="auto" >
                <DataGrid Name="datagrid_tars" Width="auto"   AutoGenerateColumns="True" >
                </DataGrid>
            </ScrollViewer>
        </StackPanel>
    </Border>
ps:我希望总有一天我能回答他们提出的问题来帮助别人。

1 个答案:

答案 0 :(得分:0)

  

数组的总数取决于最终用户选择的内容。

换句话说,挑战在于确定运行时的列数。有多种方法可以做到这一点:

  1. 使用代码隐藏在运行时将列添加到DataGrid。
  2. 将ItemsSource绑定到DataTable
  3. 将ItemsSource绑定到动态类型对象的集合
  4. 数字2,DataTable可能是您的方案的最佳方法。只需为每个文件/数组添加一列,然后将每个文件的迭代作为一行添加到表中。有一个如何在上面的链接中执行此操作的示例,但是这是您可以这样做的方法(假设一个获取数组列表的函数,并返回DataTable)(未经测试):

    DataTable GetTable(List<double[]> sourceArrays)
    {
        // 1. add the columns
    
        DataTable table = new DataTable("table");
        for (int i=0 ; i<sourceArrays.Length ; i++)
            table.Add(new DataColumn());
    
        // 2. add the rows
    
        bool done = false;
        int rowNum = 0;
        while (!done)
        {
            var row = new List<double?>();
            for (int i=0 ; i<sourceArrays.Length ; i++)
                row.Add(rowNum < sourceArrays[i].Count ? sourceArrays[i][rownum] : null);
            if (row.All(col => !col.HasValue))
                done = true;
            else
                table.Rows.Add(row.ToArray());
            rowNum++;
        }
        return table;
    }