为什么全局声明DataTable没有保留其价值?

时间:2008-12-17 22:17:51

标签: c# asp.net gridview datatable

我有一个带有gridview的aspx页面。在我的页面加载事件中,我加载了一个包含所有数据的数据表,如下所示:

HistoricalPricing historicalPricing = new HistoricalPricing();
DataTable dtHistoricalPricing = new DataTable();

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            dtHistoricalPricing = historicalPricing.GetAuctionData();
        }
    }

以上将数据归结为数据表罚款。我还有一个列表框,其中包含拍卖列表。当我点击拍卖时,我使用DataView上的RowFilter来显示带有所选数据的Gridview,但DataTable似乎失去了它的价值,我无法弄清楚原因。以下是代码:

protected void lstAuctions_SelectedIndexChanged(object sender, EventArgs e)
    {
        DataView dvPricing = new DataView(dtHistoricalPricing); // Loses Value
        dvPricing.RowFilter = "Auction = 1"; //Hard-Coded for Test
        gvPricing.DataSource = dvPricing.ToTable();
        gvPricing.DataBind();
    }

4 个答案:

答案 0 :(得分:2)

每次进行回发时,您都要处理页面类的新实例。这意味着一个新的数据表对象。

如果确实希望在回发之间保留它(并确保在可能有1000人同时点击此Web服务器时考虑内存含义),那么您可以将Session,ViewState或其他持久状态的位置中的数据表。

答案 1 :(得分:1)

我想我想通了,是不是因为当我点击ListBox时,它会进行回发而我只是在第一次加载页面时加载数据?如果这是正确的,我想我回答了我自己的问题。

在将数据表加载到第一个页面加载后,我把它放在Session中,这似乎解决了我的问题。不确定这是否是最佳方式。

答案 2 :(得分:1)

排序回答了你自己的问题。您正在每次加载页面时创建对象的新实例,因此当列表框发布回发时,您的代码将处理不同的对象。

最好全局声明对象,然后在!Postback代码中实例化它,例如:

DataTable dtHistoricalPricing = null;

...

if (!Page.IsPostBack)
{
   if (dtHistoricalPosting == null)
   {
       //shouldn't need to do a new dtHistoricalPricing as the method below is returning a new instance?
       dtHistoricalPricing = historicalPricing.GetAuctionData();
   }
}

答案 3 :(得分:1)

很难在ASP.NET中的请求之间保留值。最可靠的方法是将它放在ViewState中,但这会把整个东西发送到客户端并返回,所以你不应该在那里放很多数据。会话是一种替代方案,但当用户在同一会话中打开包含您的页面的多个窗口时,它可能会成为一个问题。然后还有应用程序状态和缓存,但这些在所有请求之间共享(无论用户是否)。另外,如果您有一个Web场,那么每个服务器的值都是本地的。更重要的是,IIS也可以在同一台机器上生成多个ASP.NET进程,并且每个进程都有自己的应用程序状态。关于静态变量也可以这么说。