2012-08-09 8 views
7

Ich habe eine GridView, zu der ich eine ObjectDataSoure als Datenquelle verwende. Die ObjectDataSource nimmt Parameter aus einer TextBox und DropDownList auf, die dann an die gespeicherte Prozedur übergeben werden. Es gibt auch eine Schaltfläche namens Search, die verwendet werden kann, um eine Aktualisierung auf der GridView zu erzwingen, indem Werte in der TextBox und/oder DropDownList bereitgestellt/geändert werden. Ich habe jedoch festgestellt, dass ich nicht auf die Schaltfläche Suchen klicken muss, wenn ich die Werte geändert habe. Ein einfaches Klicken auf die GridView verursacht eine Datenbindung.Ist es möglich, ObjectDataSource vom automatischen Binden abzuhalten?

Gibt es trotzdem, um diese Aktion zu verhindern, während die ObjectDataSource noch verwendet wird?

+0

Bitte zeigen Sie Ihren Code.Ich denke, Sie haben automatische Postback für eine Ihrer Kontrolle. – SMK

+0

@ShoaibMuhammadKhan Weder die ObjectDataSource noch das GridView-Steuerelement verfügen über eine AutoPostback-Eigenschaft. Die TextBox und DropDownList hat AutoPostback als false festgelegt. –

+0

Mögliches Duplikat: http://stackoverflow.com/questions/831208/databind-and-postback http://stackoverflow.com/questions/1262220/is-this-the-only-way-we-can-force -objectdatasource-to – SMK

Antwort

6

Wenn Sie eine DataSourceID der GridView zuweisen, wird das Raster automatisch an die ObjectDataSource gebunden. Sie können diese Eigenschaft in der GridView einfach weglassen und warten, bis das Klick-Ereignis der Suche auf sie zuweist.

+0

aber wie automatisch page postback auf gridview klicken? – SMK

+0

@ derek-hunziker Wollen Sie die DataSourceID-Eigenschaft des GridView aus dem aspx entfernen und aus dem Code-Behind setzen? –

+0

Das ist korrekt, entfernen Sie es von der Aspx-Seite und warten Sie, bis Ihr Klickereignis es im Codebehind zugewiesen hat. Es würde helfen, Ihre GridView-Definition sowie Ihre DataSource zu sehen. Kannst du etwas Code posten? –

3

Das Problem ist, dass jedes Mal, wenn ein für ObjectDataSource verwendeter Parameter geändert wird, der ODS einen "DataBind" ausführt.

Sie können zwei HiddenFields verwenden, um die Werte beizubehalten. Die ObjectDataSource führt nur einen "DataBind" durch, wenn Sie die Werte in den HiddenFields ändern. Sie können also die Werte für TextBox und DropDownList ändern, und wenn Sie einen "DataBind" möchten, müssen Sie nur die Werte in die HiddenFields kopieren.

Hier ist ein Codebeispiel I für eine andere question gemacht: Q11874496WebApp.7z

+1

Danke @Hailton für Ihren Vorschlag. Ich fühle mich ein bisschen unwillig, keine versteckten Felder mehr zu benutzen, da ich schon ziemlich viel benutzt habe. Aber wenn es schlimmer wird, werde ich das wahrscheinlich nutzen, schließlich könnte man argumentieren, wie viel von einem Unterschied ein paar versteckte Felder ausmachen werden ... oder? –

1

In meinem Fall habe ich verwendet, nur eine private boolean Feld in Code-Behind und seine Werte auf datasourceName_Selecting Ereignis respektieren. i

Zum Beispiel erklärt die folgende:

private bool IsInSearchingMode = false; 

Set es stimmt nur im Suchmodus:

protected void btnSearch_Click(object sender, EventArgs e) 
    { 
     this.IsInSearchingMode = true; 
     this.gridData.DataBind(); 
    } 

und dann den Wert überprüfen Auswahl Ereignis:

 protected void myLinqDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
     { 
      e.Result = new List<BranchDataClass>(); 
      if (!this.IsInSearchingMode) 
       return; 

// e.result = select code 
} 

A Nachteil ist, dass ein neuer page_load, der nicht von btnSearch_Click verursacht wird, den Wert der privaten Variable zurücksetzt. Wenn Sie möchten, dass es persistent ist, sollten Sie ein verstecktes Feld wie vorgeschlagen verwenden oder es speichern, um den Status anzuzeigen.

Verwandte Themen