【问题标题】:DataGridView becomes null for some reasonDataGridView 因某种原因变为空
【发布时间】:2014-01-11 21:17:13
【问题描述】:

我有一个 NET 2.0 框架 ASP.NET 应用程序..

我遇到问题的页面有一个按钮 (B1),下面是一个 DataGridView (DGV),然后是第二个按钮 ( B2) ..

最初只有 B1 是可见的。当用户单击 B1 时,我进行一些 DB 查询,获取一些数据,将其放入 DataTable 中,然后将该 DGV 的DataSource 设置为该 DataTable .. B1 还使 DGV 和 B2 可见,这两者之前都是不可见的.. 现在用户在现在可见的 DGV 中填写一些数据并点击 B2 ..

问题是在 B2 的代码中,如果我尝试查看该 DGV 的 DataSource,它的值为 null !? .. 我需要访问该 DGV 中的更新值 .. 我该怎么做?

我尝试了一些 hack,但似乎没有任何效果.. 我已经通过 FindControl 让它工作了,但我不想使用它,因为我需要原始 DataTable 出于其他原因(此处未提及,因为它们非常复杂)..

B1后面的代码,设置DataTable DataSource:

epsDGV.DataSource = epsDataDT; // epsDataDT is the DataTable:

B2 后面的代码,获取 DataTable:

DataTable epsDataDT2 = (DataTable)epsDGV.DataSource; //returns null

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 它是一个简单的代码.. 在 B1 上,有一行设置 DataSource 属性,在 B2 上,有一行试图在新的 DataTable 变量中获取 DataTable .. 我在上面添加了代码。 . 所有其他代码都是与计算相关的,在这里不关心这个功能,所以没有必要提及..
  • 我已经添加了上面的代码虽然..
  • 有什么想法吗? ://

标签: asp.net datagridview datatable session-variables


【解决方案1】:

回发期间数据源不可用。它在当前页面生命周期中使用每行的相关数据填充网格,然后被丢弃。

如果它没有这样做,那么它需要在视图状态中将它发送回客户端。鉴于您可以将包含数千条记录的列表交给它(根据分页设置,它可能只显示其中一些记录),它会导致视图状态巨大膨胀——所有这些都需要发送到客户端,然后在点击 B2 时备份到服务器。

相反,网格控件将跟踪填充到其列中的数据。这将包括在内联编辑期间所做的更改。

我发现的大多数在线示例都建议使用 FindControl 来获取新值,并使用 ViewState 来存储(和检索)数据源 - 如果您确实需要保存它。但是,我强烈建议不要这样做,除非您可以保证数据源非常小 - 否则您可能会阻塞客户端带宽(特别是如果它们的连接速度较慢)

如果您需要将其存储在 ViewState 中,只需创建如下所示的属性(注意:您的数据源对象需要可序列化,否则将无法存储在 ViewState 中) :

public List<Items> Items
{
    get 
    {
        if (ViewState["Items"] != null)
            return (List<Items>)ViewState["Items"];
        else
            return null;
    }
    set { ViewState["Items"] = value; }
}

然后在您的数据加载方法中设置它。在回发时,您可以调用该属性将其拉出 Viewstate。

【讨论】:

  • 数据非常小..如何从 ViewState 存储/检索它?
  • 我添加了一个示例,说明如何从 ViewState 存储/提取数据。您将需要一些机制来匹配您正在查看的行与您的集合中的记录 - 它不会自动执行此操作。而且您仍然需要使用 FindControl 等从 DGV 中提取已编辑的值。
  • 我尝试了ViewState 代码,但它也无法正常工作。在此处发布:pastebin.com/as9xBc9j .. :/ .. 在您的代码中,我不明白需要使用 List :S
  • 你不需要使用List:属性的数据类型完全取决于你自己的数据结构。我以 List 为例,因为这就是我正在测试的内容。就您的示例而言,您仍然试图从 B2 中的DataSource 中提取数据。那永远行不通。 viewstate 示例为您提供了一种方法来存储您将DataSource 设置为的值,因此您可以在回发期间检索它。您仍然需要手动从 VS 中提取值,并将其与您在 DGV 中的记录相匹配 - nothing 会自动为您连接。
  • @Obsidian Phoenix - 只是想添加一个注释:Items 类必须是 Serializable
猜你喜欢
  • 2013-12-22
  • 2016-05-10
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多