【问题标题】:DataGridView not displaying my ListDataGridView 不显示我的列表
【发布时间】:2013-08-15 07:24:53
【问题描述】:

虽然这个网站上有很多关于用对象填充网格视图的帖子,但我无法让它工作。

我有一个名为 Logs 的类,它有 3 个公共属性——时间、描述和错误。 还有一个名为 logList 的公共属性将返回日志对象列表。

我的 WinForm 中有 DataGridView,称为 myGV,有 3 列,分别称为 Time、Description 和 Error。

所以我正在尝试:

myGV.DataSource = Logs.logList.OrderBy(x => x.Time);

但我的 DataGridView 什么也不显示,即使 logList 确实包含数据。

感谢您在本网站上所做的工作!

更新: 如果我从 myGV 中删除所有列,它会显示数据。那么如何将静态列与我的对象列表中的属性匹配呢?

【问题讨论】:

  • 你的栏目是怎么被“称为”什么的?
  • 另外,您使用的是 WinForms 还是 WPF?
  • 列的“名称”属性设置为时间、描述和错误。
  • 你的logList是什么类型的?它是一个列表、数组、...吗? (更好的是,您能发布您的 Logs 课程吗?)
  • 看看这个例子,如果它可以帮助你以不同的方式设置绑定:stackoverflow.com/questions/125109/…(看看 Jared 的答案)

标签: c# winforms list datagridview


【解决方案1】:

OrderBy() 返回 IOrderedEnumerable 类型的数据,不能绑定到 DataGridView。 因此,您必须将它们强制转换为绑定源。 使用 ToList() 方法,如 “OrderBy().ToList()”绑定你的gridview。 dataGridView1.DataSource = studList.OrderBy(a => a.Age).ToList();

它正在工作

有关绑定 DataGridView 的更多信息,请访问dataGridView binding

【讨论】:

    【解决方案2】:

    你说的很奇怪If I remove all columns from myGV it does display data...。我重现了您的问题,原因是您的 LINQ 查询未执行。在将结果用作DataGridViewDataSource 之前,您必须调用ToList() 或类似方法:

    myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();
    

    当然,如果您的静态列没有与 DataSource 的属性匹配的 DataPropertyName,则添加到您的 DataGridView 的列将比您预期的要多。例如,假设在设计时添加所有TimeDescriptionError,而不分配任何DataPropertyNameyourDataGridView.AutoGenerateColumns = true(默认情况下),如果将DataGridViewDataSource 分配为上面,您的 DataGridView 可能有 6 列,而不是 3 列。因此,您可以在为您的 DataGridView 分配 DataSource 之前分配您添加的列的 DataPropertyName,如下所示:

    myGV.Columns["Time"].DataPropertyName = "Time";
    myGV.Columns["Description"].DataPropertyName = "Description";
    myGV.Columns["Error"].DataPropertyName = "Error";
    myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();//This should be called at here after all the DataPropertyNames are initialized.
    

    我建议你设置myGV.AutoGenerateColumns = true(默认)并删除所有添加的列,让DataGridView为你自动生成列。

    【讨论】:

    • 谢谢!设置 DataPropertyName 是必要的,但问题是没有按照您的建议执行 LINQ。添加 ToList() 就可以了。
    【解决方案3】:

    手动添加列后,您必须确保更新每一列的DataPropertyName

    • 单击 DataGridView 顶部的小箭头,以显示控件的任务。
    • 点击编辑列
    • 为您的每一列找到属性DataPropertyName 并将它们更改为DateErrorDescription 以及您用于列的任何其他名称。

    确保这些与您在 Logs 类中的 Properties 匹配。

    【讨论】:

    • 感谢您完整简洁的回答。这本身不起作用,尽管它绝对是问题的一部分。我不得不按照下面金刚的回答调用 ToList()。
    猜你喜欢
    • 2017-03-09
    • 2012-03-08
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    相关资源
    最近更新 更多