我有一个.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
答案 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中拉回。