2010-04-14 3 views
3

Может ли кто-нибудь объяснить, как/когда запускается объект ObjectDataSource? У меня есть страница ASP.NET с GridView, которая ссылается на ODS. Я поставил точку останова в методе, используемом ODS, и заметил, что он стрелял дважды.ObjectDataSource запускается дважды или самостоятельно

Я заглянул в код, и сначала мне показалось очевидным. У меня было

Page_Load() 
    { 
     if(!Page.IsPostBack) 
     { 
      MethodA(); 
      MethodB(); 
     } 
    } 

, где MethodA и MethodB оба в конечном итоге вызывали gv.DataBind(). Это имело смысл, поскольку я предполагаю, что каждый вызов GridView.DataBind() приведет к запросу ODS для данных и, следовательно, к запуску метода доступа к данным.

Странно то, что при комментировании вызова MethodA он все еще срабатывает дважды. Проверка стека вызовов показывает, что метод запускается сначала в результате метода MethodB, а затем снова без тропы, кроме [External Code]. Эта загадочная нагрузка не Случается, когда я позволяю MethodA и MethodB выполнять оба.

Любая идея, что здесь происходит? Любая идея, какой у меня может быть другой код, который запрашивает данные ODS? Я начинаю думать, что все эти элементы управления данными «без кода» больше обфускации и BS, чем они того стоят.

ответ

3

Я столкнулся с этой проблемой, когда мы скрывали/показывали столбец gridview динамически в коде.

Вот страница, которая говорит о некоторых проблемах, которые могут вызвать многочисленные Выбирается http://forums.asp.net/t/1161164.aspx

+0

Да, это оказалось именно так, мы скрываем/показываем столбцы в событии GridView.DataBound, и если мы этого не делаем, это не срабатывает дважды. Я проверю вашу ссылку, но какой метод вы использовали для решения этой проблемы? – LoveMeSomeCode

+1

Мы переместили скрытие/показ из DataBound в Page_Load. – Homer

0

«когда закомментируйте вызов Methoda, он все еще стреляет дважды». Поэтому он, вероятно, будет дважды вызываться Page_Load. Возможно, у вас есть AutoEventWireup = «истинное», а также регистрирующее событие в коде http://www.aspdeveloper.net/tiki-index.php?page=ASPFaqEventsDoubleFire

+0

Нет, похоже, что Page_Load вызывается только один раз. Спасибо за ссылку, хотя, я посмотрю. – LoveMeSomeCode

0

Если вы установите источник данных в GridView с чем-то вроде

gv.DataSourceID=dsObjDataSource; 

то вид сетки вызывает gv.DataBind() сами по себе.

+0

мы делаем это в aspx, но не в коде – LoveMeSomeCode

+0

Не имеет значения, какой из двух файлов устанавливает это свойство (aspx и aspx.cs) – mikek3332002

0

У меня была такая же проблема - проблема заключалась в том, что я скрывал/показывал колонку после или во время привязки данных. Перемещение кода скрытия/шоу до привязка данных остановила привязку от события дважды, что, как я подозреваю, является тем же эффектом, что и перенос его на страницу PageLoad. В моем случае привязка данных происходила в ответ на изменение списка выпадающих списков - добавление/удаление столбца до того, как вызов DataBind() устранил проблему два вопроса для меня.

+0

В нашем сценарии также оказалось, что у нас были некоторые столбцы, указанные в markup, и ods овладеют этими и свяжутся в первый раз, а затем мы динамически вводим столбцы классами ITemplate и запускаем повторную проверку. Я ненавижу ОРВ. – LoveMeSomeCode

0

Я получал тот же результат с DataBinding, происходящим дважды, используя asp:DataList и asp:ObjectDataSource.

Он оказался, потому что я использую UserControl в некоторых параметрах:

<asp:ControlParameter Name="GroupID" Type="Int32" DefaultValue="-1" 
    ControlID="UserControl1" PropertyName="SelectedGroupID" /> 

Я получаю устал от UserControls. Я вижу, как они могут повысить производительность для 5-го класса, но это полная трата времени на более высоком уровне.

+2

Я устал от веб-форм ASP.NET на самом деле. Переключенные задания, и теперь я делаю MVC. Это не идеально, но я не пропускаю безумство черного ящика элементов управления веб-формами. – LoveMeSomeCode

1

Несколько вызовов метода привязки gridview могут возникать неявно, если вы меняете видимость, то есть отображаете и/или скрываете столбцы gridview, привязанные к источнику данных объекта.

В этом случае попробуйте инкапсулировать код столбца show/hide gridview в обработчике событий Page_LoadComplete.

Обработчик событий Page_LoadComplete занимает основное место в жизненном цикле страницы, чтобы предотвратить множественные вызовы данных и все еще быть эффективным, поскольку он вызывается после событий смены управления (например, нажатие кнопки, удаление выбранного индекса и т. Д.). перед событиями привязки данных gridview.

Смежные вопросы