【问题标题】:Why doesn't globally declared DataTable retains its value?为什么全局声明的 DataTable 不保留其价值?
【发布时间】:2008-12-17 22:17:50
【问题描述】:

我有一个带有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();
    }

【问题讨论】:

    标签: c# asp.net gridview datatable


    【解决方案1】:

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

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

    【讨论】:

    • 这些选项是否占用内存最少?
    • 这取决于您存储的内容、服务器获得的流量等。例如:ViewState 在小型公司内部网中很棒,每个都有快速上传时间,但在为公共 Intranet 上的拨号用户提供页面时不太好。
    • 公共内网拨号用户?什么是拨号用户?
    • 天啊!意思是互联网。但是您仍然可以为 Intranet 提供“拨号”用户,因为这类似于某些类型的 vpns 的工作方式。
    【解决方案2】:

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

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

    【讨论】:

    • 这是正确的:每次您回发时,您都在使用页面类的全新实例。
    • 嗯,不,这不是最好的方法。只需每次重新加载 DataTable,或者将 DataTable 放入缓存中,或者最合适的是放入 ViewState。
    【解决方案3】:

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

    你最好全局声明对象,然后在 !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();
       }
    }
    

    【讨论】:

    • 我之前试过这个,当我到达 SelectedIndexChanged 事件时,dtHistoricalPricing 为空,所以当我尝试使用 RowFilter 时它给了我一个错误。
    【解决方案4】:

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

    【讨论】:

    • 实际上,假设所有用户都获得相同的下拉列表,那么应用程序状态将是这样做的好地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多