2015-09-16 5 views
1

У меня есть GridView, который загружает некоторые данные по нагрузке, как это:Как избежать перезагрузки данных GridView при каждой обратной передаче?

protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     if (!Page.IsPostBack) 
     { 
      DataTable dataSource = LoadObjects(); 
      gvObjects.DataSource = dataSource; 
     } 
    } 

Я также добавил SelectedIndexChanged обработчик события, где я хочу, чтобы выполнить некоторые функции, когда выбрана строка. Проблема заключается в том, что, если я не удалю проверку IsPostBack из метода OnLoad, когда выбрана строка, атрибут GridView.SelectedRow не выбран мной.

В идеале я не хочу загружать все данные из базы данных при каждой обратной передаче. Есть ли какие-либо лучшие методы для получения выбранной строки во время события SelectedIndexChanged, не перезагружая все снова?

Спасибо.

+0

Выбирает ли другие строки или строки NO, если вы сохраняете условие IsPostback? Вы установили какой-либо NEW selectedindex в обработчике событий? –

+0

Если вы хотите избежать обратной передачи, когда каждый раз выбираете какую-то строку, тогда вам нужно использовать js в сочетании со скрытым полем ввода. – nelek

ответ

1

По умолчанию GridView выбирает строку на основе индекса. Попробуйте указать GridView для выбора строк на основе ключей.

Установите EnablePersistedSelection на true, чтобы выбор строки основывался на значениях ключа данных. Теперь, если ваша ранее выбранная строка получает свой индекс или позицию, изменена каким-либо образом, она останется выбранной.

1

Обычно у меня есть GridViews, полный динамических элементов управления, которые могут быть очень «забавными», если они не воссозданы на PostBack, они не работают.

Вы, кажется, заинтересованы только в SelectedRow, но это решение также будет работать и поможет сэкономить вам головную боль, если вы начнете получать фантазии с динамическим управлением

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    gvObjects.DataSource = LoadCachedObjects(); 
    gvObjects.DataBind(); 
} 


private DataTable LoadCachedObjects() 
{ 
    var result = new DataTable(); 
    if ((Session["CachedDataTable"] != null) && (IsPostBack)) 
    { 
     //cached DataTable will only be used on PostBack 
     result = Session["CachedDataTable"] as DataTable; 
    } 
    if (result.Rows.Count == 0) 
    { 
     result = LoadObjects(); //Get data from the database 
     Session["CachedDataTable"] = result; 
    } 
    return result; 
} 

This только загружает данные из сессии, когда постбэк событие , поэтому у вас будет одна начальная база данных при загрузке страницы. Также, если вы в конечном итоге используете этот код на других страницах, вам не нужно волноваться о том, чтобы дать переменной сеанса уникальное имя.

+1

Это может быть быстро, но это может быть очень опасно на более высокой базе пользователей. Представьте, что 1000 человек посещают сайт, в сеансе будет 1000 коллекций ввода данных (целая серия). – modiX

0

Если вы не можете предотвратить обратные передачи, вам, очевидно, придется перезагрузить. Таким образом, решение было бы попытаться перезагрузить как можно меньше.

Хорошим способом является кэширование данных где-то, например, в объекте Session. Но только кешируйте первичные ключи вместе с индексом результата (от 1 до итогового результата). Таким образом, вы можете быстро получить первичные ключи, для которых нужны данные, и получать только эти данные из базы данных.