2009-03-16 3 views
3

Я использую объект ObjectDataSource с GridView с обработчиком OnObjectCreated по коду. Если я программно изменяю значение дочернего элемента управления в GridView, весь элемент управления получает привязку данных второй раз в том же запросе (как показано обработчиком OnObjectCreated), чего я не хочу. Это происходит в исходном запросе GET страницы (так что это не проблема обратной передачи). Вот что след показывает:ObjectDataSource, созданный дважды при изменении управления

aspx.page Begin PreRender 
Custom  IN handleDSObjectCreated() => tsDao: ETime.DAL.TimeSheetDAO  
Custom  OUT handleDSObjectCreated() 
Custom  IN handleDSObjectCreated() => tsDao: ETime.DAL.TimeSheetDAO  
Custom  OUT handleDSObjectCreated() 
aspx.page End PreRender 

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

Update:

Я не уверен, если это поможет или нет, но глядя на трассировку стека в точке, которая называется обработчиком OnObjectCreated показывает следующие отличия:

Первое событие Handler Призвание:

System.Web.dll!System.Web.UI.WebControls.GridView.DataBind() + 0x5 bytes 
System.Web.dll!System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() + 0x53 bytes 
System.Web.dll!System.Web.UI.WebControls.GridView.OnPreRender(System.EventArgs e = {System.EventArgs}) + 0x19 bytes 
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0x57 bytes 

Второй Обработчик события Призвание:

System.Web.dll!System.Web.UI.WebControls.GridView.DataBind() + 0x5 bytes 
System.Web.dll!System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() + 0x53 bytes  
System.Web.dll!System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() + 0x46 bytes 
System.Web.dll!System.Web.UI.Control.EnsureChildControls() + 0x58 bytes 
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0x33 bytes 

Опять же, это все из первоначального запроса GET. Любые идеи, почему это вызвано дважды?

ответ

2

Может быть, вы должны использовать

if(!IsPostBack){ 
//your code. 
} 

Это вы ищете?

+0

К сожалению, нет. Это происходит по инициативе GET. –

0

Является ли тот факт, что привязка данных происходит дважды в вашем сценарии, вызывая другие проблемы? Просто fyi, вы можете сами управлять созданием объекта источника данных, обрабатывая событие ObjectCreating. Если вы установите свойство ObjectDataSourceEventArgs.ObjectInstance в обработчике действительного (не нулевого) экземпляра, источник данных будет привязываться к этому экземпляру, а не создавать новый.

+0

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

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