我有一个带有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();
}
答案 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进程,并且每个进程都有自己的应用程序状态。关于静态变量也可以这么说。