GridView теряет данные во время обратной передачи - PullRequest
7 голосов
/ 22 декабря 2010

У меня есть aspx.Page, содержащая сетку. Вид сетки привязан в коде к источнику данных только тогда, когда не происходит обратной передачи, и имеет enableviewstate = true (страница тоже) Во время обратной передачи данные, связанные с сеткой, будут потеряны. Что может быть причиной. Пожалуйста, спросите, нужен ли код.

Ответы [ 5 ]

12 голосов
/ 22 декабря 2010

Решил, проблема была в том, что я сделал Page.Databind () в событии Page_Load главной страницы страницы с сеткой, поэтому он связывал сетку при каждой обратной передаче без данных.Спасибо за все усилия.

3 голосов
/ 22 декабря 2010

Это по замыслу.Эти данные нигде не сохраняются от загрузки страницы до загрузки страницы.Вам нужно будет выполнить одну из следующих 3 задач:

  1. Хранить данные в ViewState (не обязательно рекомендуется, если данные большие)
  2. Хранить данные в объекте Session (та же самая история, большие данные равняются плохому использованию памяти)
  3. Совершите обратную поездку для повторного связывания данных при каждой загрузке страницы (происходит сбой, если в базе данных слишком много активности или запрос медленный)

Я предпочитаю совершать возвраты в базу данных, когда мне нужно, и поддерживать мой SQL настроенным на производительность.Большие нагрузки на страницы раздражают, и слишком большой объем памяти сеанса может привести к замедлению работы сервера.Я полагаю, что вы также можете хранить эти данные в кеше, но я никогда не пробовал их, поэтому не знаю, какие существуют ограничения или возможности.

0 голосов
/ 10 мая 2012

Хорошо, я знаю, что ответ действительно поздно, но я только что столкнулся с той же проблемой.

Я связывался с данными каждый раз, когда загружал страницу, и когда возвращалась запись, запрашивалась сетка. Но используя:

if(!IsPostBack)
{ //code used to bind on first page load }

в событии Page_Load, похоже, помогло:)

0 голосов
/ 22 декабря 2010

Вы упускаете понятие здесь. Это очень элементарный вопрос, на который Google может ответить за вас.

В любом случае, «DataSource» всех элементов управления DataBound будет вести себя только для чтения и будет читать, когда ему необходимо связать элемент управления. Чтобы сохранить данные, вам нужен другой способ. Например, ViewState или Session

  • ViewState - это как карман для вставки на страницу. Чем больше, тем больше будет загружаться страница, если она больше. Сохраненные вами объекты будут сериализованы в строковые данные. Чем больше объект, тем больше видимость и больше пропускная способность. Имейте в виду, что объект должен быть сериализуемым.

  • Сессия, как карман для каждого пользователя, и она остается на сервере, значит, быстрее, чем viewstate. Но большая сессия будет занимать больше МБ в оперативной памяти

редактировать уууууу, ты все еще не понял. Включить ViewState не помогает. давайте посмотрим на структуру.

<html>
 <head>  
 </head>
 <body>
  <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="..." />
 </body>
</html>

вход является (фактическим) ViewState. Когда вы устанавливаете enable ViewState на WebControls, он будет хранить «некоторые сериализуемые (в основном тип значения)» данные. В вашем случае GridView.EnableViewState означает, что он будет хранить некоторое свойство в своем собственном (логическом) ViewState, а не на странице ViewState.

В коде позади этого. ViewState ["someName"] = ...; это страница ViewState. Давайте посмотрим на серверный код.

this.ViewState["someName"] = somDataTable; // this won't work
this.ViewState["someID"] = "abc"; // this work fine

Поскольку DataTable не имеет ISerializable, для которого viewstate необходимо преобразовать любой объект в строковую базу. Вы можете реализовать свою собственную серилизацию и назначить ее представлению, например, преобразовать DataTable в byte [] и присвоить состоянию просмотра.

попробуйте Session вместо

0 голосов
/ 22 декабря 2010

из описания проблемы.это звучит так, как будто вы делаете привязку данных в коде позади.в таком случае asp.net не сохраняет источник данных в viewstate для вас.попробуйте получить данные и сохранить их в объекте хеш-таблицы ViewState с чем-то вроде ViewState["GridviewData"] = GridviewData

и получить их оттуда между постбэками

...