2011-11-16 15 views
7

Metà della battaglia di ottenere una risposta è sapere come fare la domanda. Non sono certo che sto facendo un buon lavoro, ma questo è il mio colpo migliore.Come associare DropDownList in GridView con dati non da GridView

Sto cercando di associare un ddl con i dati all'interno di un gridview che NON proviene dal gridview stesso. Questo è all'interno di EditItemTemplate. Lo scopo è di dare all'utente, per iniziare, un valore selezionato e una serie di altri valori da una procedura di ricerca memorizzata.

Qui dirò che l'ho fatto con successo ma utilizzando un oggetto ObjectDataSource. Sto cercando di evitarlo questa volta e farlo interamente dal codice sottostante per ora quindi spostarlo in un livello dati in seguito.

Ecco quello che ho finora ...

<asp:GridView ID="usersGrid" runat="server"     
     DataKeyNames="userID" 
     AutoGenerateColumns="false" Width="580" 
     OnRowUpdating="usersGrid_RowUpdating" 
     OnRowEditing="usersGrid_RowEditing" 
     OnRowCancelingEdit="usersGrid_RowCancelingEdit"         OnRowDeleting="usersGrid_RowDeleting" 
     > 

...

<EditItemTemplate> 
       <div class="gridName"> 
        <asp:TextBox ID="txtFirstName" Text='<%#Eval("firstName") %>' runat="server" Width="95" /> 
       </div> 
       <div class="gridName"> 
        <asp:TextBox ID="txtLastName" Text='<%#Eval("lastName") %>' runat="server" Width="95" /> 
       </div> 
       <div class="gridEmail"> 
        <asp:TextBox ID="txtEmail" Text='<%#Eval("email") %>' runat="server" Width="245" /> 
       </div> 
       <div class="gridName"> 
        <asp:DropDownList ID="ddl_GetLists" 
        DataSourceID="GetListData()" 
        AppendDataBoundItems="true" 
        DataValueField="listID" 
        DataTextField="listName" 
        SelectedValue='<%#Bind("listID") %>' 
        runat="server" 
        > 
        </asp:DropDownList> 
       </div> 
      </EditItemTemplate> 

....

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    usersGrid.EditIndex = e.NewEditIndex 
    BindData() 

End Sub 

....

Private Sub BindData() 
    Dim conn As New SqlConnection(connectionString) 
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_USERS", conn) 
    Dim ds As New DataSet() 
    ad.Fill(ds) 
    GetListData() 
    usersGrid.DataSource = ds 
    usersGrid.DataBind() 

End Sub 

Includo gli ultimi due e altri approcci che ho provato e fallito.

...

Protected Sub usersGrid_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    If e.Row.RowState = DataControlRowState.Edit Then 
     Dim ddl As DropDownList = DirectCast(e.Row.FindControl("ddl_GetLists"), DropDownList) 

     Dim conn As New SqlConnection(connectionString) 
     Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn) 
     Dim ds As New DataSet() 
     ad.Fill(ds) 

     ddl.DataSource = ds 
     ddl.DataBind() 
    End If 
End Sub 

Public Function BindDropdown() As DataSet 
    Dim conn As New SqlConnection(connectionString) 
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn) 
    Dim ds As New DataSet() 
    ad.Fill(ds) 

    ddl_GetLists.DataSource = ds 
    ddl_GetLists.DataBind() 
End Function 

Sarò anche chiedere perché, nella funzione finale, perché è il controllo, ddl_GetLists, non riconosciuto come bene? All'interno della griglia scompare dal progettista ma al di fuori della griglia riappare.

Grazie a tutti per il vostro aiuto.

risposta

11

di avere un paio di opzioni. È possibile utilizzare un controllo dell'origine dati oppure è possibile associare i menu a discesa in code-behind nell'evento RowDataBound di GridView.

ho notato un paio di problemi nel codice troppo. Nel tuo esempio stai assegnando il DataSourceID in modo errato. Il DataSourceID dovrebbe puntare al ID di un controllo origine dati nella pagina:

<asp:DropDownList ID="ddl_GetLists"  
    DataSourceID="SqlDataSource1"  
    AppendDataBoundItems="true"  
    DataValueField="listID"  
    DataTextField="listName"  
    SelectedValue='<%#Bind("listID") %>'  
    runat="server">  
</asp:DropDownList> 

<asp:SqlDataSource ID="SqlDataSource1" runat="server"     
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>"     
    SelectCommand="SELECT listID, listName FROM SomeTable">            
</asp:SqlDataSource> 

Se si vuole fare il legame in code-behind, è possibile farlo attraverso il RowDataBound evento:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) 
    If e.Row.RowType = DataControlRowType.DataRow AndAlso (e.Row.RowState And DataControlRowState.Edit) = DataControlRowState.Edit Then 
     Dim ddl As DropDownList = TryCast(e.Row.FindControl("ddl_GetLists"), DropDownList) 
     If ddl IsNot Nothing Then 
      ddl.DataSource = RetrieveDataSource() 
      ddl.DataBind() 
     End If 
    End If 
End Sub 
+0

Ho fatto con successo qualcosa di simile a questo tramite un ObjectDataSource in passato, ma sto cercando di fare questo esclusivamente dal codice di questo periodo. È possibile? –

+0

Sì, sicuramente. Dammi un secondo e aggiornerò la mia risposta. –

+0

Riguardo alla proprietà ConnectionStrings. L'app che mi è stata assegnata per l'aggiunta utilizza una chiave in appSettings invece del normale attributo connectiontring dal file di configurazione. C'è un modo per chiamarlo da sqldatasource? –

0

Vedo un paio di problemi

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    usersGrid.EditIndex = e.NewEditIndex 
    BindData() 

End Sub 

Perché stai facendo questo? Perché dovresti legare nuovamente la griglia a un evento sulla tua griglia che è già stato riempito?

+1

La seconda parte della risposta è errata. Non dovrebbe esserci un problema nel trovare il controllo usando quell'ID. –

+0

Sei corretto. Aggiornerò – Etch

+0

Devo notare che durante l'utilizzo di VS 2010 il controllo ddl, mentre nella griglia non è "visibile" all'applicazione, ma quando lo toglierò dalla rete è "." Non ho alcuna spiegazione a riguardo –

1

Si può semplicemente creare una lista globale di tipo che si desidera e impostarlo come nulla se si utilizza LINQ poi appena messo quella fonte nel DropDownListObject.DataSource

DropDownListObject.DataSource=ObjListSource; 
DropDownListObject.DataBind; 

Spero che sarà utile.

0

a risolvere questo:

  1. Nella pagina di codice, è possibile definire una funzione pubblica GetListData() (penso che hai fatto).

  2. proprietà DataSource Usa (se si desidera chiamare una funzione):

      <asp:DropDownList ID="ddl_GetLists" 
               DataSource='<%# GetListData() %>' 
               AppendDataBoundItems="true" 
               DataValueField="listID" 
               DataTextField="listName" 
               SelectedValue='<%#Bind("listID") %>' 
               runat="server" > 
          </asp:DropDownList> 
    
+0

Grazie per la tua risposta. Puoi mettere un po 'di interruzioni di riga nel tuo contenuto se lasci 2 spazi alla fine della riga. Questo rende la risposta più chiara. –