无法转换类型为“ <> f__AnonymousType5`3 [System.String,System.String,System.String]”的类型为“ System.Data.DataRowView”的对象。”

时间:2019-06-06 13:51:08

标签: c# wpf

am试图获取选定行中每个单元格的值,在我弄清楚它出现此异常的方式之后

这是一个例外:

'无法将类型为'<> f__AnonymousType5`3 [System.String,System.String,System.String]'的类型转换为'System.Data.DataRowView'。”

        var query = (from sc in cd.SubjectTeachers
                     join s in cd.Subjects on sc.IdSubject equals s.Id
                     join t in cd.Teachers on sc.IdTeacher equals t.Id
                     join b in cd.Branches on sc.IdBranch equals b.Id

                     select new { t.NickName, s.Code, b.TypeOfBranch }).ToList();
        PlanDG.ItemsSource = query;


        DataRowView dataRow = (DataRowView)PlanDG.SelectedItem;

        string cellValue = dataRow.Row.ItemArray[0].ToString();

我想它可以运行,但是它在DataRowView行中运行异常

1 个答案:

答案 0 :(得分:2)

SelectedItem将成为您要分配给ItemsSource的LINQ查询中的对象之一。它们不是DataRowViews。它们是匿名类型的实例,您不能转换为匿名类型。

因此,最好的选择是编写一个具有所需三个属性的小类,然后使用它。

public class DGItem {
    public String NickName { get; set; }
    public String Code { get; set; }
    public String TypeOfBranch { get; set; }
}

现在在查询中创建这些对象,而不是匿名对象:

var query = (from sc in cd.SubjectTeachers
             join s in cd.Subjects on sc.IdSubject equals s.Id
             join t in cd.Teachers on sc.IdTeacher equals t.Id
             join b in cd.Branches on sc.IdBranch equals b.Id

             select new DGItem { 
                 NickName = t.NickName, 
                 Code = s.Code, 
                 TypeOfBranch = b.TypeOfBranch 
             }).ToList();

PlanDG.ItemsSource = query;

现在,您可以将SelectedItem转换为适当的类型,并加以利用:

DGItem dataRow = (DGItem)PlanDG.SelectedItem;

string cellValue = dataRow.NickName;