1

我有一个带有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

4 回答 4

2

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

如果您真的想在回发之间保留它(并确保您考虑到可能有 1000 人同时访问此 Web 服务器时的内存影响),那么您可以将数据表放在 Session、ViewState 或其他位置持续状态。

于 2008-12-17T22:35:58.110 回答
1

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

在第一次加载页面加载后,我将数据表放入 Session 中,这似乎解决了我的问题。不确定这是否是最好的方法。

于 2008-12-17T22:24:23.263 回答
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();
   }
}
于 2008-12-17T22:29:13.457 回答
1

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

于 2008-12-17T22:40:16.540 回答