DataGrid绑定DataTable出错

本文详细介绍了如何使用DataGrid进行数据展示时的性能优化技巧,包括避免直接使用ItemSource属性,采用CollectionViewSource进行数据转换,实现数据虚拟化以加快DataGrid渲染速度,以及通过设置列宽和行高来提升显示效果。此外,还提供了实现数据分页的具体代码示例,包括跳转至首页、上一页、下一页和末页的功能。

直接用DataGrid.ItemSource = DataTable.DefaultView时会出现以下错误:

target element is 'TextBlock' (Name=''); target property is 'Text

 

需要用CollectionViewSource来做中间转换 .另外实时更新数据,所以不能把它做成StaticResource。

要想DataGrid render速度快,需要支持虚拟化,及设置列宽和行高。

<toolkit:DataGrid VirtualizingStackPanel.VirtualizationMode="Recycling" 
                                      VirtualizingStackPanel.IsVirtualizing="True" 
                                      EnableColumnVirtualization="True"
                                      EnableRowVirtualization="True"
                                      RowHeight="23"
                                      ColumnWidth="100"
                                      ScrollViewer.HorizontalScrollBarVisibility="Visible"
                                      ScrollViewer.VerticalScrollBarVisibility="Visible"
                                      Name="DgdData" Grid.Row="0" AutoGenerateColumns="True" DataContext="{Binding DataTableSource}" ItemsSource="{Binding}" />
                    
 private void BtnFirstPage_Click(object sender, RoutedEventArgs e)
        {
            this.mData.DataPageNum = 1;
            this.SetDisData(this.mData.DataPageNum, this.mData.DataPageSize);
        }

        private void BtnPrevPage_Click(object sender, RoutedEventArgs e)
        {
            this.mData.DataPageNum--;
            this.mData.DataPageNum = this.mData.DataPageNum > 1 ? this.mData.DataPageNum : 1;
            this.SetDisData(this.mData.DataPageNum, this.mData.DataPageSize);
        }

        private void BtnNextPage_Click(object sender, RoutedEventArgs e)
        {
            int maxPageNum = (int)Math.Ceiling((double)this.mData.Times.Count / (double)this.mData.DataPageSize);
            this.mData.DataPageNum++;
            this.mData.DataPageNum = this.mData.DataPageNum > maxPageNum ? maxPageNum : this.mData.DataPageNum;
            this.SetDisData(this.mData.DataPageNum, this.mData.DataPageSize);
        }

        private void BtnLastPage_Click(object sender, RoutedEventArgs e)
        {
            int maxPageNum = (int)Math.Ceiling((double)this.mData.Times.Count / (double)this.mData.DataPageSize);
            this.mData.DataPageNum = maxPageNum;
            this.SetDisData(this.mData.DataPageNum, this.mData.DataPageSize);
        }
        
        private void SetDisData(int pageNum, int pageSize)
        {
            DataRow row;
            int startRow = (pageNum - 1) * pageSize;
            int endRow = startRow + pageSize;
            endRow = this.mData.Times.Count > endRow ? endRow : this.mData.Times.Count;
            this.mDtData.Rows.Clear();

            CollectionViewSource itemCollectionViewSource2 = new CollectionViewSource();
            itemCollectionViewSource2.Source = this.mDtData;
            DgdData.DataContext = itemCollectionViewSource2;

        }

 

在WPF中,DataGrid是一种用于显示数据集合的强大工具。要将DataTable绑定DataGrid,你可以按照以下步骤操作: 1. **创建DataTable**: 首先,你需要创建一个DataTable,填充它的一些列和行数据。例如: ```csharp DataTable dataTable = new DataTable("MyTable"); dataTable.Columns.Add("Column1", typeof(string)); dataTable.Columns.Add("Column2", typeof(int)); DataRow newRow = dataTable.NewRow(); newRow["Column1"] = "Value1"; newRow["Column2"] = 42; dataTable.Rows.Add(newRow); ``` 2. **准备DataView**: 使用DataTable的DefaultView属性创建一个DataView,这是DataGrid所期望的数据源: ```csharp DataView view = new DataView(dataTable); view.Sort = "Column1 ASC"; // 可选,对数据进行排序 ``` 3. **绑定DataGrid**: 将DataView设置为DataGrid的ItemsSource,这样DataGrid就会自动渲染每一行数据: ```xaml <DataGrid x:Name="dataGrid" ItemsSource="{Binding Source={StaticResource dataTableView}, UpdateSourceTrigger=PropertyChanged}"> <DataGrid.Columns> <DataGridTextColumn Header="Column1" Binding="{Binding Column1}" /> <DataGridTextColumn Header="Column2" Binding="{Binding Column2}" /> </DataGrid.Columns> </DataGrid> <!-- 在XAML.cs文件中定义资源 --> public static readonly DependencyProperty DataSourceProperty = DependencyProperty.Register("DataSource", typeof(DataView), typeof(MyWindow), new PropertyMetadata(null, OnDataSourceChanged)); public DataView DataSource { get { return (DataView)GetValue(DataSourceProperty); } set { SetValue(DataSourceProperty, value); } } private static void OnDataSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((MyWindow)d).dataGrid.ItemsSource = (e.NewValue as DataView); } ``` 现在,DataGrid会显示DataTable的内容,并可以根据"Column1"列进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值