从Datatable到Datatable到List

时间:2017-05-18 06:28:50

标签: c# linq datatable

您好,先生,我不是英文原文,stackoverflow中的新功能和编程新功能,但我会尽力与您分享我的问题: 我在代码中添加了一些注释,希望您能更好地了解问题所在 我试图制作类似临时数据表的东西,它从1个特定数据表中获取信息(只有行很重要)(代码中会有更多内容),“temporarydatatable”将这些信息提供给列表<>我用linq试了一下。我有自己的想法,并试图改变它我理解的方式(LINQ query on a DataTable这对我来说真的没有用:X)我尝试了其他一些东西,但我不想在这里粉碎10个链接:P 所以这里是代码:

public MainWindow()
{
    InitializeComponent();
    datatable1();

}

public void datatable1()
{
    /*This Table should get the informations from datatable_1 or
    another one (there will be some more tables and the viewtable will 
    get the informations from the table where the 
    Type ==(i guess it will be a combobox) selected Type */
    DataTable viewtable = new DataTable();
    viewtable.Columns.Add("Typ", typeof(string));
    viewtable.Columns.Add("Name", typeof(string));
    viewtable.Columns.Add("Anzahl", typeof(string));
    viewtable.Columns.Add("Zeit", typeof(string));
    /*here is the main problem i have*/     
    viewtable.Rows =from _Row1 in datatable_1 where "Typ" =="Una";
    /*it "worked" like this so i get the informations in my list*/    
    viewtable.Rows.Add("Una", "Testschrank2", "9000", "0:20:30");

    //this table is a example table holding the informations 
     DataTable datatable_1 = new DataTable();
     datatable_1.Clear();
     datatable_1.Columns.Add("Typ");
     datatable_1.Columns.Add("Name");
     datatable_1.Columns.Add("Anzahl");
     datatable_1.Columns.Add("Zeit");
     DataRow _Row1 = datatable_1.NewRow();
     datatable_1.Rows.Add("Una", "Testschrank2", "9000", "0:20:30");
    // _Row1["Zeit"] = (4, 30, 0);
    datatable_1.Rows.Add(_Row1);`
}
好吧,我想我添加了太多的代码,但就像我说我真的很新,所以我有点难以指出我的问题,小代码请原谅我先生 和 谢谢你的帮助o /

1 个答案:

答案 0 :(得分:3)

要从第一个DataTable获取值,您必须将其中的所有DataRows作为评论中建议的Lei Yang

DataRow temp = datatable_1.Rows.OfType<DataRow>()
                          .SingleOrDefault(x=>x["Typ"].ToString() == "Una");

1:您无法分配属性Rows,因为它是readonly

2:您不能只使用viewtable.Rows.Add(temp),因为此行已经属于另一个表。这将产生System.ArgumentException

所以你需要导入行:

if (temp != null)
{
    viewtable.ImportRow(temp);
}

编辑:

如果您打算使用where子句捕获多行,可以使用List<DataRow>临时保存它们,然后在循环中导入每一行:

List<DataRow> temp = datatable_1.Rows.OfType<DataRow>()
                                .Where(x => x["Typ"].ToString() == "Una").ToList();


if (temp.Count > 0)
{
    foreach (var row in temp)
    {
        viewtable.ImportRow(row);
    }
}

编辑2:

以下是进一步研究的一些资料来源:

How to: Locate a Specific Row in a DataTable

在此示例中,您还可以使用Select方法获取所需的行。这看起来像这样:

DataRow [] temp2 = datatable_1.Select("Typ ='Una'", "Name DESC", DataViewRowState.Added);

// or the short version:
DataRow [] temp2 = datatable_1.Select("Typ ='Una'");

结果将是一样的。这个版本是从answer到类似的问题。