由于某种原因,DataGridView变为null

时间:2014-01-11 21:17:14

标签: asp.net datagridview datatable session-variables

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

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

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

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

我已经尝试了几次黑客攻击,但似乎没有任何工作......我已经通过FindControl完成了它,但是我不想使用它,因为我需要原始的DataTable用于其他原因(这里没有提到,因为它们非常复杂)..

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

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

B2后面的代码,获取DataTable:

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

1 个答案:

答案 0 :(得分:1)

回发期间无法使用DataSource。它在当前页面生命周期中用于使用每行的相关数据填充网格,然后将其丢弃。

如果没有这样做,则需要将其发送回viewstate内的客户端。鉴于您可以将包含数千条记录的列表(其中可能只显示其中一些记录,取决于分页设置),它会导致巨大的膨胀到视图状态 - 所有这些都需要被发送到客户端,然后当您点击B2时返回服务器。

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

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

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

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

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