Wpf DataGrid数据绑定任意列和行

时间:2015-08-11 09:27:13

标签: c# wpf xaml binding datagrid

对于我的一个项目,我正在尝试从文件中加载数据(例如* .csv)并将其显示在DataGrid中。没有给出文件的格式。例如,列和行的数量因文件而异。因此,任务是将一般数据表加载到程序中,并在DataGrid

中查看

我的第一次尝试是使用DataTable并以某种方式将其绑定到DataGrid。但是,经过一段时间的搜索,我发现使用DataTable并不是最好的解决方案,应该使用数据模型。不幸的是,Web中的大多数示例都使用具有固定数据列的数据。此外,我无法使DataGridDataTable之间的绑定正常工作。能够对两端的数据进行更改是非常好的:DataGrid(如用户所愿)和底层数据结构(如代码所示)。

请有人解释一下,为什么不应该使用DataTable?应该使用什么来实现上述行为?

数据加载本身应该不是问题,但如何以灵活的方式存储,处理和绑定数据表到DataGrid

以下代码类型的作品。但是,似乎没有响应数据的任何更改,例如添加行或列,但DataTable包含正确的数据。

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True"
 x:Name="myDataGrid1" AutoGenerateColumns="True" ItemsSource="{Binding myDataTable}"  />
DataTable myDataTable  { get; private set; }
...
myDataGrid.DataContext = this;
LoadData();
myDataGrid.ItemsSource = myDataTable.DefaultView;

我非常感谢任何帮助!提前谢谢!

2 个答案:

答案 0 :(得分:0)

尝试将ItemsSource设置为BindingListCollectionView。到目前为止,我已经好运了。我使用这些扩展方法:

  public static BindingListCollectionView GetCollectionView(this DataTable table)
        {
            return new BindingListCollectionView(table.DefaultView);
        }



 public static DataTable GetDataTable(this BindingListCollectionView view)
    {
        var dataView = view.SourceCollection as DataView;
        if (dataView != null)
        {
            return dataView.Table;
        }

        return null;
    }

在您的代码中使用它,如:

myDataGrid.ItemsSource = myDataTable.GetCollectionView();

var view = myDataGrid.ItemsSource as BindingListCollectionView;
var table = view.GetDataTable();

您应该能够像保留网格所做的所有更改一样使用DataTable对象。

答案 1 :(得分:0)

经过一些进一步的调查后,我找到了一个对我来说很好的解决方案。然而,感觉有点奇怪而不是最好的解决方案,但我可以忍受。再次感谢您的努力,这对我帮助很大。

我们的想法是,在添加/删除列时,通过取消设置/设置GridView的{​​{1}}来刷新DataContext。我使用GridView事件来实现此行为。

现在,几乎一切都很好。剩下的唯一问题是当用户通过DataTable.Columns.CollectionChanged添加新行时(单击最后一个空行并键入数据)。然而,这只是一个小问题,因为绑定的GridView已正确更新,并且只有第二个DataTable(在下面的示例中)未正确显示。

问题仍然存在,无论GridView的使用是否是最佳解决方案。如果需要测试DataTable的重置导致大数据集的麻烦......

以下是有关问题和解决方案的完整示例:

XAML:

DataContext

代码背后:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Class="WpfApplicationTest.MainWindow"
         Title="DataGrid and DataTable Test" Height="500" Width="800">
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
            <Button Click="ButtonRefresh_Click">Refresh Grids</Button>
            <Button Click="ButtonAddRow_Click">Add Row</Button>
            <Button Click="ButtonAddCol_Click">Add Col</Button>
            <Button Click="ButtonEdit_Click">Edit Randomly</Button>
        </StackPanel>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <DataGrid x:Name="myDataGrid0" Grid.Column="0" AutoGenerateColumns="True" ItemsSource="{Binding}" />
            <DataGrid x:Name="myDataGrid1" Grid.Column="1" AutoGenerateColumns="True" ItemsSource="{Binding}" />
        </Grid>
    </DockPanel>
</Window>