DataTable 到可观察集合

问题描述 投票:0回答:3

我一直在谷歌上搜索并在这里寻找答案,但我仍然无法理解一个非常基本的事情 - 如何将

DataTable
转换为
ObservableCollection

这就是我已经走了多远:

public ObservableCollection<Test> test;

public class Test
{
    public int id_test { get; set; }
    public string name { get; set; }
} 

主要..

DataTable TestTable = new DataTable();
TestTable.Columns.Add(new DataColumn("id_test", typeof(int)));
TestTable.Columns.Add(new DataColumn("name", typeof(string)));
DS.Tables.Add(TestTable);

var test = new ObservableCollection<Test>();
foreach (DataRow row in test_table.Rows)
{
    var obj = new Test()
    {
        id_test = (int)row.ItemArray[0],
        name = (string)row.ItemArray[1]
    };
    test.Add(obj);
}
        

我更新了代码,它似乎可以工作。

c# wpf datatable observablecollection
3个回答
6
投票

您不想为表中的每一行创建一个新集合,而是为整个表创建一个集合(集合中的一个对象是为表中的一行创建的):

var test = new ObservableCollection<Test>();
foreach(var row in TestTable.Rows)
{
    var obj = new Test()
    {
        id_test = (int)row["id_test"],
        name = (string)row["name"]
    };
    test.Add(obj);
}

2
投票

我对已接受的解决方案有一点疑问。 它不允许在 var 类型上使用 [] 括号。

var test = new ObservableCollection<Test>();
foreach(DataRow row in TestTable.Rows)
{
    test.Add(new Test()
    {
        id_test = (int)row["id_test"],
        name = (string)row["name"],
     });
 }

1
投票

如果您打算使用此 ObservableCollection 绑定到 WPF 控件并获取更改通知,则可能不需要进行 DataTable > ObservableCollection 转换。一些内置 WPF 控件(例如

System.Windows.Controls.DataGrid
)在绑定到 DataTable 时已经提供了更改通知机制。例如,当您添加、更新或删除源 DataTable 中的行时,DataGrid 将自动反映这些更改。示例:

<DataGrid ItemsSource="{Binding ViewModelPropertyAsDataTable}"/>
另一方面,一些第三方控件(例如 Telerik RadGridView)使用

DataTable.DefaultView 属性 来提供更改通知。示例:

<telerik:RadGridView ItemsSource="{Binding ViewModelPropertyAsDataTable.DefaultView}"/>
    
© www.soinside.com 2019 - 2024. All rights reserved.