2010-07-23 9 views
4

J'ai un GridView lié à un SqlDataSource avec un défaut SelectCommand défini comme tel:Changement SqlDataSource.SelectCommand lors des pauses d'exécution Pagination

<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet" 
     ConnectionString="<%$ ConnectionStrings:MyConn %>" 
     ProviderName="MySql.Data.MySqlClient" 
     SelectCommand="select * from blah blah" /> 

Il y a des cas où je dois changer cette requête dynamiquement lors de l'exécution, je procédez comme suit:

SqlDataSource1.SelectCommand = sql; // 'sql' is the new query 
GridView1.PageIndex = 0; 
GridView1.EditIndex = -1; 
GridView1.SelectedIndex = -1; 
GridView1.DataBind(); 
updatePanel.Update(); 

Cela fonctionne très bien fait, mais quand je clique sur les contrôles de pagination, le résultat par défaut remis à l'SelectCommand défini dans le SqlDataSource1.

Quelque chose autour de ça?

Merci, Mark

Répondre

8

Le problème ici est que le SqlDataSource est recréé lorsque la page se charge sur l'envoi émis par les liens Pager. Il n'y a rien à dire pour charger ce que vous avez défini dynamiquement. Si vous deviez utiliser une procédure stockée avec des paramètres, ASP enregistrerait les paramètres dans ViewState et relancerait la sélection dans SqlDataSource lorsque la page serait chargée.

Donc ce que vous avez à faire est de dire au SqlDataSource ce qu'il avait pour SQL lors de son dernier chargement correctement. La méthode la plus simple consiste à stocker le code SQL dans ViewState lorsque vous définissez la commande SelectCommand de SqlDataSource, puis de le récupérer à nouveau dans l'événement Page_Load et de le rétablir. Par exemple: Disons que vous avez un TextBox pour certains critères et un bouton de recherche. Lorsque l'utilisateur entre du texte dans la TextBox et clique ensuite sur le bouton "Rechercher", vous voulez qu'il crée un peu de SQL (Ceci, au fait, vous laisse une grande exposition aux attaques par Injection SQL. critères bien.), puis définissez la propriété SelectCommand de SqlDataSource. C'est un point que vous voudriez sauver du SQL. Ensuite, dans l'événement Page_Load, vous souhaiterez le récupérer et définir la propriété SelectCommand sur cette valeur.

Dans le clic de bouton, vous pouvez stocker le SQL:

Dim sSQL as String 

sSQL = "SELECT somefields FROM sometable WHERE somefield = '" & Me.txtCriteria.Text & "'" 
SqlDataSource1.SelectCommand = sSQL 
ViewState("MySQL") = sSQL 

Puis dans l'événement Page_Load, vous pouvez récupérer le SQL et définir la propriété SelectCommand:

Dim sSQL as String 

If Me.IsPostBack() Then 
    sSQL = ViewState("MySQL") 
    SqlDataSource1.SelectCommand = sSQL 
End If 
+2

-1 Cette approche est sujettes à l'injection SQL et n'est pas recommandé. Vous devez utiliser des paramètres, pas de concaténation de chaîne. –

+5

Mike, vous avez raison à propos de l'injection SQL et j'ai noté cela dans la réponse originale. J'essayais simplement de répondre à la question posée. Je suis également d'accord que l'utilisation d'une procédure stockée avec des paramètres est la meilleure solution. – dscarr

0

1) Essayez de configurer dataSource l'aperçu de la page, pas dynamiquement. Ceci est la solution la plus claire Si vous ne pouvez pas,

2) Essayez de générer la liste avant page_load. Je pense que placer le code sous page_init pourrait faire l'affaire. Je ne me souviens pas exactement pour le moment, mais il y a une méthode avant page_load.