2011-11-16 24 views
7

La mitad de la batalla para obtener una respuesta es saber cómo hacer la pregunta. No estoy seguro de estar haciendo un buen trabajo, pero esta es mi mejor oportunidad.Cómo enlazar DropDownList en Gridview con datos NOT desde gridview

Estoy intentando vincular un ddl con datos dentro de una vista de cuadrícula que NO proviene de la vista de cuadrícula. Esto está dentro de EditItemTemplate. El propósito de hacerlo es dar al usuario, para comenzar, un valor seleccionado y una serie de otros valores de un procedimiento almacenado de búsqueda.

Mencionare aquí que he hecho esto con éxito antes pero usando un ObjectDataSource. Estoy tratando de evitar eso esta vez y hacerlo completamente desde el código de atrás por ahora, luego moverlo a una capa de datos más tarde.

Esto es lo que tengo hasta ahora ...

<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 

Estoy incluyendo los últimos dos y otros enfoques que probé y fallé.

...

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 

También voy a preguntar por qué, en la función final, ¿por qué es el control, ddl_GetLists, no se reconoce así? Dentro de la grilla, desaparece del diseñador, pero vuelve a aparecer fuera de la grilla.

Gracias a todos por su ayuda.

Respuesta

11

Tienes un par de opciones. Puede usar un control de fuente de datos, o puede enlazar las listas desplegables en código subyacente en el evento RowDataBound de GridView.

También noté un par de problemas en su código. En su ejemplo, está asignando el DataSourceID incorrectamente. El DataSourceID debe apuntar a la ID de un control de origen de datos en la página:

<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> 

Si usted quiere hacer la unión en el código subyacente, puede hacerlo a través del 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

que he hecho con éxito algo similar a esto usando un ObjectDataSource en el pasado, pero estoy tratando de hacer esto exclusivamente del código detrás de este tiempo. es posible? –

+0

Sí, definitivamente. Dame un segundo y actualizaré mi respuesta. –

+0

Con respecto a la propiedad ConnectionStrings. La aplicación que me asignaron para agregar utiliza una clave en appSettings en lugar del atributo de conexión de línea normal del archivo de configuración. ¿Hay alguna manera de invocarlo desde sqldatasource? –

0

Veo un par de problemas.

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

End Sub 

¿Por qué haces esto? ¿Por qué vincular la cuadrícula nuevamente en un evento en su cuadrícula que ya se ha llenado?

+1

La segunda parte de su respuesta es incorrecta. No debería haber problemas para encontrar el control con esa ID. –

+0

Estás en lo correcto. Voy a actualizar. – Etch

+0

Debería tener en cuenta que al usar VS 2010 el control ddl, mientras que en la vista de cuadrícula "no es visible" para la aplicación, pero cuando lo saco de la red "es". No tengo ninguna explicación para esto. –

1

simplemente Puede crear una lista global de tipo que desea y configurarlo como nula si está utilizando LINQ a continuación, sólo hay que poner esa fuente en el DropDownListObject.DataSource

DropDownListObject.DataSource=ObjListSource; 
DropDownListObject.DataBind; 

Esperamos que sea útil.

0

puede solucionar esto:

  1. En la página de códigos, se define una función pública GetListData() (creo que lo hizo).

  2. establecimiento Uso origen de datos (si desea llamar a una función):

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

Gracias usted por su respuesta. Puede poner algunos saltos de línea en su contenido si deja 2 espacios al final de la línea. Esto hace que la respuesta sea más clara. –