数据表格转换为可观察集合

7

我一直在谷歌和搜索答案,但我仍然无法理解一个非常基本的问题 - 如何将DataTable转换为Observable Collection?

这是我目前所得到的:

public ObservableCollection<Test> test;

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

Main..

 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);

我更新了代码,现在似乎可以正常工作了。

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);
}

哦,我的天啊,我真傻,你是对的。但是你确定上面的代码能够工作吗?我很有可能漏掉了什么,但是问题1)它无法识别“name”。 - boo_boo_bear
@boo_boo_bear 我尝试使用与您在问题中使用的相同列和属性名称 - 也许您项目中的代码与您最初发布的有所不同?您得到了什么确切的错误? - Andy
谢谢你的帮助。我已经更新了问题中的代码,现在它可以工作了。我知道我不应该在评论区问其他问题,但我不知道如何正确地绑定它。它没有添加任何内容到ComboBoxColumn。 - boo_boo_bear
@boo_boo_bear 不客气 :) 如果你遇到了其他问题,随时可以再问。 - Andy
1
在 new Test() 的第一个变量赋值后面的分号需要改为逗号,第二个变量赋值后面的分号需要删除。 - lentz

2

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

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
在新的Test声明中,移除最后一个变量赋值后面的逗号。 - lentz

0

如果您打算使用此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}"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接