【问题标题】:How to populate a dataGridView with an IQueryable如何使用 IQueryable 填充 dataGridView
【发布时间】:2012-09-18 03:57:01
【问题描述】:

我已经添加了必需的列和正确的 DataPropertyName s,并且我使用以下代码来填充 datagridview。但是,我的 dataGridView 仅显示列标题和一个空行。我的代码有什么问题?

public static IQueryable<Kolon> kolonlistele()
{
    using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities())
    {
        var result = from k in ctx.Kolons
                     select k;

        return result;
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = veritabani_islemleri.kolonlistele();
}

【问题讨论】:

  • 如果你打电话给dataGridView1.DataBind() 和/或.kolonlistele().ToList()会发生什么
  • 错误 1“System.Windows.Forms.DataGridView”不包含“DataBind”的定义,并且没有扩展方法“DataBind”接受“System.Windows.Forms.DataGridView”类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)
  • .ToList() 有效。但这不是我想要的。我希望能够更新 dataGridView 上的数据。
  • 啊..是的。我正在考虑使用 Databind 调用的 WebForms。 @Servy 解释了为什么 .ToList 有效。

标签: c# winforms entity-framework iqueryable


【解决方案1】:

这里的问题是延迟执行。 result 实际上不是结果。这不是查询的结果,而只是查询本身。这就是IQueryable 的含义。您可以将其视为 SQL 查询的复杂版本,而不是结果集。在您对其进行迭代或使用某种对其进行迭代的方法之前,不会执行实际的查询。 (例如调用ToList,将其放入foreach,或者像这里的情况一样,将其绑定到DataGridView

这种延迟执行在这里特别成问题,因为涉及到一次性资源。直到您在 using 块之外,您才真正执行查询,这意味着在您实际尝试执行查询时,DataSource 已被释放。

解决此问题的一种方法是急切地执行查询:

public static IQueryable<Kolon> kolonlistele()
{
    using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities())
    {
        return ctx.Kolons.ToList();
    }
}

通过调用usingToList inside,查询在数据源被释放之前执行。另请注意,我删除了from k in ctx.Kolons select k,因为它实际上并没有完成任何事情;这完全是多余的。

您的另一个选择是扩大数据源的范围。如果不是在 kolonlistele 方法中声明它,而是在“更高范围”声明数据源,以便在对象尚未释放时设置数据源,那么它也可以工作。这在创建数据源的成本更高的情况下更合适,或者当查询的大小如此之大以至于流式传输它很重要时(如果您需要流式传输数据然后急切地将其评估为List会是个问题)。

【讨论】:

  • 我明白你的意思。那么你能告诉我一种填充 datagridview 并能够在 datagridview 上更新数据的方法吗?
  • @HasanAyan 那将是您需要使用我提到的第二种解决方案的时间示例;您需要增加数据上下文的范围,以便在您完成使用它之前不会释放它。如果您想使用同一个进行更新,则可能意味着将其设置为实例字段并在 Form dispose 方法中手动处理它,而不是通过 using
  • 我已经完成了你所说的。我现在不处理它。但如果我不调用 .ToList(),它不会显示任何数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多