2013-07-22 4 views
1

J'ai un arraylist dans mon code derrière qui stocke les valeurs d'id de divers éléments qui sont dans une base de données. En cliquant sur un bouton, je souhaite passer ces valeurs d'id à un SQLDataSource pour agir en tant que paramètre pour peupler un gridview. Malheureusement, ma connaissance limitée de VB me gêne, et je suis confus quant à la façon dont on ferait une telle chose.Passer la liste aux paramètres d'un sqldatasource

Code derrière

Protected Sub Preview_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Preview_Button.Click 

    Dim list As New ArrayList 
    Dim atLeastOneRowSelected As Boolean = False 
    'Iterate through the Devices.Rows property 
    For Each row As GridViewRow In GridView1.Rows 
     'Access the CheckBox 
     Dim cb As CheckBox = row.FindControl("DeviceSelector") 
     If cb IsNot Nothing AndAlso cb.Checked Then 
      atLeastOneRowSelected = True 
      'First, get the device_id for the selected row 
      Dim device_id As Integer = _ 
       Convert.ToInt32(GridView1.DataKeys(row.RowIndex).Value) 
      list.Add(device_id) 
     End If 
    Next 

End Sub 

SQLDataSource au sein de la page .aspx

<asp:SqlDataSource ID="SqlDataSource3" runat="server" 
       ConnectionString="<%$ ConnectionStrings:LOTOConnectionString %>" 
       SelectCommand="SELECT * FROM [DEVICES] WHERE ([devices_id] = @devices_id)"> 
    <SelectParameters> 
     <asp:Parameter Name="devices_id" Type="Int32" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

EDIT

Après avoir joué un peu, je me suis rendu compte que je peux former mon liste dans une chaîne SQL appropriée usi ng la commande de jointure. Donc la seule partie que je ne comprends toujours pas est comment référencer la SQLDataSource de mon code derrière.

Répondre

0

Eh bien, j'ai compris ce que je devais faire. Je crée dynamiquement une requête SQL et la passe à mon SQLDataSource. Je ne suis pas exactement sûr si cela me rend enclin à l'injection SQL, mais puisque la requête que je génère tire ses données d'un gridview séparé, je crois que tout va bien?

Code derrière

Protected Sub Preview_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Preview_Button.Click 

    'Finds all checkboxes that have been selected in GridView1 
    Dim list As New ArrayList 
    Dim atLeastOneRowSelected As Boolean = False 

    'Iterate through each row of GridView1 
    For Each row As GridViewRow In GridView1.Rows 
     'Access the CheckBox 
     Dim cb As CheckBox = row.FindControl("DeviceSelector") 
     If cb IsNot Nothing AndAlso cb.Checked Then 
      atLeastOneRowSelected = True 
      'Get the device_id of the selected row 
      Dim device_id As Integer = _ 
       Convert.ToInt32(GridView1.DataKeys(row.RowIndex).Value) 
      list.Add(device_id) 
     End If 
    Next 

    If atLeastOneRowSelected Then 
     'Generate an SQL command using the selected checkboxes 
     Dim str As String = String.Join(" OR devices_id = ", list.ToArray()) 
     Dim query As String = "Select * FROM [DEVICES] where devices_id = " + str 
     SqlDataSource3.SelectCommand = query 

     'Enable the GenerateReport Button 
     GenerateReport_Button.Enabled = True 
    End If 
End Sub 

SQLDataSource

<asp:SqlDataSource ID="SqlDataSource3" runat="server" 
       ConnectionString="<%$ ConnectionStrings:LOTOConnectionString %>" 
       SelectCommand=""></asp:SqlDataSource> 
0

Utilisez simplement l'événement Selecting de SqlDataSource pour définir la valeur du paramètre: devices_id. Cet événement se produit juste avant que DataSource n'effectue la requête. Ainsi, toutes les valeurs définies dans cet événement seront utilisées par la requête à exécuter.

<asp:SqlDataSource ID="SqlDataSource3" runat="server"  
    OnSelecting="SqlDataSource3_Selecting" 
    ConnectionString="<%$ ConnectionStrings:LOTOConnectionString %>" 
    SelectCommand="SELECT * FROM [DEVICES] WHERE ([devices_id] = @devices_id)"> 

Je ne sais pas la syntaxe en VB, peut être inférieure par exemple en C# peut vous aider que la logique est la même, seule la syntaxe est différente.

protected void SqlDataSource3_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
{ 
    for (int i=0;i < arrList.Count - 1;i++) 
    { 
     // just for example suppose Business logic needs the First ID value 
     if(i==0) 
     { 
     // the select parameters can be accessed using: e.Command.Parameters 
     e.Command.Parameters["@devices_id"].Value == Convert.ToInt32(list[i]); 
     } 
    } 
    } 
Questions connexes