Почему глобально объявленный DataTable не сохраняет свое значение? - PullRequest
1 голос
/ 18 декабря 2008

У меня есть страница aspx с сеткой. В моем событии загрузки страницы я загружаю таблицу данных со всеми данными так:

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

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

Вышеуказанные данные загружают данные в датированный штраф. У меня также есть список, который содержит список аукционов. Когда я нажимаю на аукцион, я использую RowFilter в DataView для отображения 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 ]

2 голосов
/ 18 декабря 2008

Каждый раз, когда вы делаете постбэк, вы имеете дело с новым экземпляром класса вашей страницы. Это также означает новый объект с данными.

Если вы действительно хотите сохранить его между постбэками (и убедитесь, что вы учитываете последствия для памяти, когда на вашем веб-сервере одновременно может работать 1000 человек), вы можете поместить datatable в сеансе, ViewState или другом местоположении, в котором сохраняется состояние.

1 голос
/ 18 декабря 2008

Сложно сохранять значения между запросами в ASP.NET. Наиболее надежным способом было бы поместить его во ViewState, но это отправит все это клиенту и обратно, поэтому вам не следует помещать туда много данных. Сеанс является альтернативой, но он может стать проблемой, когда пользователь открывает несколько окон с вашей страницей в одном сеансе. Кроме того, существует также состояние приложения и кэш, но они распределяются между ВСЕМИ запросами (независимо от пользователя). Кроме того, если у вас есть веб-ферма, значения там локальны для каждого сервера. Более того, IIS также может порождать несколько процессов ASP.NET на одном компьютере, и каждый из них будет иметь свое собственное состояние приложения. То же самое можно сказать и о статических переменных.

1 голос
/ 18 декабря 2008

Вроде ответил на свой вопрос. Вы создаете новый экземпляр объекта при каждой загрузке страницы, поэтому, когда список выводит постбэк, ваш код имеет дело с другим объектом.

Было бы лучше объявить объект глобально, а затем создать его экземпляр в коде обратной передачи! Например:

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();
   }
}
1 голос
/ 18 декабря 2008

Я думаю, я понял это, потому что когда я нажимаю на ListBox, он выполняет обратную передачу, и я загружаю данные только при первой загрузке страницы? Если это правильно, я думаю, что ответил на свой вопрос.

Я поместил данные в Session после загрузки их на первую страницу загрузки, и это, похоже, решило мою проблему. Не уверен, что это лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...