【问题标题】:Fill WinForms DataGridView From Anonymous Linq Query从匿名 Linq 查询中填充 WinForms DataGridView
【发布时间】:2011-02-08 11:36:25
【问题描述】:

// 来自我的表单

BindingSource bs = new BindingSource();

private void fillStudentGrid()
{
     bs.DataSource = Admin.GetStudents();
     dgViewStudents.DataSource = bs;
}

// 来自管理类

public static List<Student> GetStudents()

{
    DojoDBDataContext conn = new DojoDBDataContext();

    var query =
        (from s in conn.Students
         select new Student
         {
             ID = s.ID,
             FirstName = s.FirstName,
             LastName = s.LastName,
             Belt = s.Belt
         }).ToList();

    return query;
}

我正在尝试在 Winforms 中填充 datagridview 控件,而我只想要其中的几个值。代码编译,但抛出运行时错误:

不允许在查询中显式构造实体类型“DojoManagement.Student”。

有没有办法让它以这种方式工作?

【问题讨论】:

    标签: c# winforms linq linq-to-sql datagridview


    【解决方案1】:

    只返回一个匿名类型的对象列表:

    public static List<object> GetStudents()
    {
        DojoDBDataContext conn = new DojoDBDataContext();
    
        var query =
            (from s in conn.Students
             select new
             {
                 ID = s.ID,
                 FirstName = s.FirstName,
                 LastName = s.LastName,
                 Belt = s.Belt
             }).Cast<object>().ToList();
    
        return query;
    }
    

    【讨论】:

    • 太好了,行得通!我不禁想到有比投射更好的方法。
    • 嗯,你不能返回一个匿名类型的列表,一个List&lt;anonymous type&gt;不能被分配给一个对象列表......所以你必须转换。无论如何,最好从 GetStudents 返回真正的 Student 对象,并仅在分配数据源之前执行投影
    【解决方案2】:

    您已经有一个IEnumerable&lt;Student&gt; 实例,由于here 所述的原因,您无法从查询中投影实体

    您也不需要创建一个列表来绑定到此数据源 - 您可以通过将其更改为以下内容来大大简化您的方法:

    public static IEnumerable<Student> GetStudents()
    {
        return new DojoDBDataContext().Students;
    }
    

    没有理由投影一个新实例来仅映射一些属性,通过执行查询,无论如何您将返回所有值,而您的投影不会为您节省任何东西。如果您真的只想从此查询中返回几个值以隐藏信息,您可以这样做:

    public static IEnumerable<Object> GetStudents()
    {
        DojoDBDataContext conn = new DojoDBDataContext();
    
        return conn.Students
                   .Select(s => new {
                       ID = s.ID,
                       FirstName = s.FirstName,
                       LastName = s.LastName,
                       Belt = s.Belt 
                   });
    }
    

    编辑:如果您不使用 C# 4,则必须将 IEnumerable&lt;T&gt; 的内容显式转换为 Object。只有 C# 4 支持 IEnumerable&lt;T&gt; 的协方差。因此,如果您使用的是 C# 3,则必须这样做:

    public static IEnumerable<Object> GetStudents()
    {
        DojoDBDataContext conn = new DojoDBDataContext();
    
        return conn.Students
                   .Select(s => new {
                       ID = s.ID,
                       FirstName = s.FirstName,
                       LastName = s.LastName,
                       Belt = s.Belt 
                   }).Cast<Object>();
    }
    

    【讨论】:

    • 我正在投影一个新的 Student 实例,因为......我真的不知道我在做什么(显然)。我可以轻松地从所有学生那里获取所有信息,但我只需要几个字段并且在运行时填充数据网格视图,因为它是只读的。
    【解决方案3】:

    有一次我正在四处寻找在 Gridview 上显示结果的解决方案。 我遇到的问题是我忘记在 Winform 上将 datagrid 的属性:“Data Source”设置为 None。

    这是使用 linq 显示 gridview 的简单解决方案(只是示例代码)

    DataGrid dataGrid1 = new DataGrid();
    
    var custQuery =
        from cust in db.Customers
        select cust;
    
    dataGrid1.DataSource = custQuery;
    

    【讨论】:

    • 正在查看所有与绑定相关的高级解决方案,而忽略了最简单的解决方案。这个为我解决了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多