【问题标题】:How to add data to a DataTable in C#如何在 C# 中将数据添加到 DataTable
【发布时间】:2019-04-23 11:10:10
【问题描述】:

在我的解决方案中,我创建了两个列表

var listColumnNames = new List<KeyValuePair<string, string>>();

var listValues = new List<List<string>>();

我通过迭代输入数据集来添加数据。两个列表都构建得很好,并且包含预期的数据。随后,我使用两个 for 循环将数据添加到 DataTable。 DataTable 被实例化为private DataTable _selectedFeaturesDataTable = new DataTable(); 和稍后,在我从上面实例化并填充两个列表的任务中,我在列表接收到所有数据后编写以下内容:

_selectedFeaturesDataTable = new DataTable();
            foreach (var col in listColumnNames)
            {
                _selectedFeaturesDataTable.Columns.Add(new DataColumn(col.Key, typeof(string)) { Caption = col.Value });
            }
            foreach (var row in listValues)
            {
                var newRow = _selectedFeaturesDataTable.NewRow();
                newRow.ItemArray = row.ToArray();
                _selectedFeaturesDataTable.Rows.Add(newRow);
            }

调试代码我可以看到newRow 的ItemArray 在迭代期间包含正确的数据,而且所有值都是字符串类型。 ItemArray 中的某些列包含空字符串,但我无法想象这是问题所在。

_selectedFeaturesDataTable.Rows.Add(newRow); 行运行低谷并查看DataTableRows 属性,我可以看到每次迭代的计数都会增加。但是,DataTableRowsList 属性的值仍然为 null。

现在有例外,没有抱怨,但在DataTable 中找不到数据,而列接收列表中的值。 此外,UI 中的组件甚至不显示列名。

最后,这是我在 xaml 中定义 DataGrid 的方式以及我用于绑定的属性。

XAML

<DataGrid x:Name="winDataTable" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" HeadersVisibility="Column"
                      IsReadOnly="True" SelectionMode="Single" AutoGenerateColumns="True"
                      ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"
                      ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                      ItemsSource="{Binding Path=SelectedFeatureDataTable, Mode=OneWay}">

属性定义

public DataTable SelectedFeatureDataTable
    {
        get
        {
            return _selectedFeaturesDataTable;
        }
        set
        {
           SetProperty(ref _selectedFeaturesDataTable, value, () => SelectedFeatureDataTable);

        }
    }

为什么没有数据添加到 DataTable 对象,即使 ItemArray 包含值?

【问题讨论】:

  • 我有类似的问题,然后我意识到我必须实现INotifyPropertyChanged,当我更改数据源的内容时,我必须调用RaisePropertyChanged() 方法
  • 嗨 Leon,我必须坚持 MVVM 概念,因此整个事情实际上应该与绑定一起工作。我所有的逻辑都应该在 ViewModel 中,如果可能的话,代码隐藏文件中没有其他代码。这可能吗?

标签: c# datatable datagrid wpfdatagrid


【解决方案1】:

如果您遵循 MVVM 模式并使用 ViewModel-Class 而不是代码隐藏,您可以尝试以下方法:

public class yourViewModel : INotifyPropertyChanged

    public DataTable SelectedFeatureDataTable
        {
            get
            {
                return _selectedFeaturesDataTable;
            }
            set
            {
               SetProperty(ref _selectedFeaturesDataTable, value, () => SelectedFeatureDataTable);
               RaisePropertyChanged();
            }
        }

而且,据我所知,您可以像这样直接在 xaml 中绑定数据源:

ItemsSource="{Binding SelectedFeatureDataTable, Mode=OneWay}"

我从来没有绑定过数据表,而是使用 ListCollectionView 作为数据源,但我认为这不重要。

【讨论】:

  • 嗨@TomGeo,您应该将namespaceSystem.ComponentModel 添加到您的类中,然后您就可以使用该接口了。是的,我看到你这样绑定,但据我所知,你不必使用 path= 这个词
  • 嗨@Leon 我改变了绑定方式无济于事。 System.Component 引用已经在 ViewModel 中,但 RaisePropertyChanged() 仍然不存在。令我印象深刻的是,这样的 DataTable 在 Rows 属性中保持空值,而列名被添加到 Columns 属性中。
  • @TomGeo 很抱歉这是我的错误,我们正在使用 DevExpress 并且 RaisePropertyChanged() 方法在那里。但是请看一下这个页面:How to: Implement the INotifyPropertyChanged Interface 它基于以下帖子:stackoverflow.
  • 谢谢@Leon 我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2012-03-08
  • 2018-06-08
相关资源
最近更新 更多