2009-03-16 13 views
3

Ich verwende eine ObjectDataSource mit einem GridView mit einem OnObjectCreated-Handler auf dem Code-Behind. Wenn ich einen untergeordneten Steuerwert programmgesteuert auf dem GridView ändere, wird das gesamte Steuerelement ein zweites Mal in der gleichen Anforderung (wie durch den Handler OnObjectCreated angezeigt) datenbankgebunden, was ich nicht möchte. Dies geschieht auf der GET-Anfrage der ersten Seite (es handelt sich also nicht um ein Postback-Problem). Hier ist, was eine Spur zeigt:ObjectDataSource zweimal erstellt, wenn Steuerelement geändert wird

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 

Gibt es eine Möglichkeit, die zweite Runde der Datenbindung zu verhindern, selbst wenn ich die untergeordneten Steuerelemente zu manipulieren? Nichts in der Datenschicht ändert sich, so dass es nicht benötigt wird. Beachten Sie auch, dass keine Bild-URLs beteiligt sind, die ebenfalls eine doppelte Datenbindung verursachen. Vielen Dank.

Update:

Ich bin nicht sicher, ob das hilft oder nicht, aber an dem Stack-Trace an dem Punkt in der Suche, bei der der OnObjectCreated Handler aufgerufen zeigt folgende Unterschiede:

erste Event-Handler Invocation:

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 

Second Event Handler Invocation:

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 

Auch dies ist alles von der anfänglichen GET-Anfrage. Irgendwelche Ideen, warum es zweimal aufgerufen wird?

Antwort

2

Vielleicht sollten Sie verwenden

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

Ist das von Ihnen gesuchte?

+0

Leider nicht. Es passiert bei der initialen GET-Anfrage. –

0

Ist die Tatsache, dass die Datenbindung in Ihrem Szenario zweimal auftritt, andere Probleme? Nur fyi, Sie können die Erstellung des Datenquellenobjekts selbst verwalten, indem Sie das ObjectCreating-Ereignis behandeln. Wenn Sie die ObjectDataSourceEventArgs.ObjectInstance-Eigenschaft im Handler auf eine gültige Instanz (nicht null) festlegen, wird die Datenquelle an diese Instanz gebunden, anstatt eine neue Instanz zu erstellen.

+0

Die Sorge trifft die Datenbank zweimal auf jeder Anforderung - nicht notwendigerweise die Schaffung der doppelten Datenquelle. Ich könnte die Instanz speichern und das Ergebnis zwischenspeichern, aber ich würde lieber das Kernproblem lösen. –

Verwandte Themen