none
Ayuda con DropDownList en C# ASP.NET RRS feed

  • Pregunta

  • Hola tengo el siguiente sitio en donde el usuario debe seleccionar varias listas en donde cada una depende de la anterior, se trata de un sitio de ventas de productos y solo los administradores pueden agregar nuevos productos. Les dejo un ejemplo de como va hasta ahora.


    Los datos para llenar los DropDownList los obtengo de una base de datos. Les dejo el codigo de aquello:

    <!--LOS DROPDOWNLIST-->
    
    <!--LISTA FAMILIA PRODUCTO _ DATASOURCE_2-->
      <tr>
        <td width="21%" height="25px" align="left">
          <asp:Label runat="server" ID="Lbl_FamiliaProducto" Text="Familia:" CssClass="tit-neg-bold"></asp:Label>
        </td>
    
    
        <td width="79%" height="25px" align="left">
    
           <asp:DropDownList runat="server" ID="DDL_FamiliaProducto" DataSourceID="SqlDataSource2" DataTextField="CODIGO" AutoPostBack="True" DataValueField="ID_CODIGO" AppendDataBoundItems="True" TabIndex="3" OnSelectedIndexChanged="DDL_FamiliaProducto_SelectedIndexChanged">
               <asp:ListItem Value="0" Text="---SELECCIONE---"></asp:ListItem>
           </asp:DropDownList>
         </td>
       </tr>
    
      
    <!--LISTA SUBFAMILIA PRODUCTO _ DATASOURCE_3-->
      <tr>
         <td width="21%" height="25px" align="left">
           <asp:Label runat="server" ID="Lbl_SubFamiliaProducto" Text="SubFamilia:" CssClass="tit-neg-bold"></asp:Label>
         </td>
    
        <td width="79%" height="25px" align="left">
          <asp:DropDownList runat="server" ID="DDL_SubFamiliaProducto" DataSourceID="SqlDataSource3" DataTextField="DESCRIPCION" DataValueField="ID_SUBFAMILIA" TabIndex="4" AppendDataBoundItems="True">
               <asp:ListItem Value="0" Text="---SELECCIONE---"></asp:ListItem>
          </asp:DropDownList>
         </td>
      </tr>
    
    <!--LISTA MARCA PRODUCTO _ DATASOURCE_4-->
      <tr>
         <td width="21%" height="25px" align="left">
            <asp:Label runat="server" ID="Lbl_MarcaProducto" Text="Marca:" CssClass="tit-neg-bold"></asp:Label>
         </td>
    
         <td width="79%" height="25px" align="left">
            <asp:DropDownList runat="server" ID="DDL_MarcaProducto" DataSourceID="SqlDataSource4" DataTextField="DESCRIPCION" DataValueField="MARCA" TabIndex="5" AppendDataBoundItems="true">
               <asp:ListItem Value="0" Text="---SELECCIONE---"></asp:ListItem>
            </asp:DropDownList>
         </td>
      </tr>
                                    
    <!--LISTA TIPO PRODUCTO _DATASOURCE_5-->
      <tr>
         <td width="21%" height="25px" align="left">
            <asp:Label runat="server" ID="Lbl_TipoProducto" Text="Tipo:" CssClass="tit-neg-bold"></asp:Label>
         </td>
                                        
         <td width="79%" height="25px" align="left">
            <asp:DropDownList runat="server" ID="DDL_TipoProducto" DataSourceID="SqlDataSource5" DataTextField="DESCRIPCION" DataValueField="TIPO" TabIndex="6" AppendDataBoundItems="true">
               <asp:ListItem Value="0" Text="---SELECCIONE---"></asp:ListItem>
             </asp:DropDownList>
          </td>
      </tr>
    								
    <!--LISTA PROVEEDORES _DATASOURCE_6-->
      <tr>
         <td>
            <asp:Label runat="server" Text="Proveedor:" CssClass="tit-neg-bold"></asp:Label>
         </td>
         
         <td>
            <asp:DropDownList runat="server" ID="DDL_Proveedor" DataSourceID="SqlDataSource6" DataTextField="NOMBRE" DataValueField="PROVEEDOR" TabInDEX="7" AppendDataBoundItems="true">
                <asp:ListItem Value="0" Text="---SELECCIONE---"></asp:ListItem>
            </asp:DropDownList>
         </td>
      </tr>

    Y ahora los SqlDataSources respectivos de cada DropdownList:

    <asp:Content runat="server">
    
       <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:SAADConneccion %>" SelectCommand="OBTIENE_TABLA" 
            SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:Parameter DefaultValue="3" Name="TABLA" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource> 
        
        <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:SAADConneccion %>" SelectCommand="OBTIENE_SUBFAMILIAXFAM" 
            SelectCommandType="StoredProcedure">
            <SelectParameters>
        	    <asp:ControlParameter ControlID="HDDFamilia" Name="FAMILIA" PropertyName="Value" />
    	    </SelectParameters> 
        </asp:SqlDataSource> 
        
    
        <!--ESTE ME DA PROBLEMAS NO ME MUESTRA DATOS, 
        Y YA PROBÉ EL PROCEDIMIENTO ALMACENADO 
        Y SI TRAE DATOS-->
    
        <asp:SqlDataSource ID="SqlDataSource4" runat="server" ConnectionString="<%$ ConnectionStrings:SAADConneccion %>" SelectCommand="OBTIENE_MARCA_PRODUCTO " 
           SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter ControlID="HDDMarca" Name="DESCRIPCION" PropertyName="Value"/>
            </SelectParameters>
        </asp:SqlDataSource>
        <!--______________________________________________________-->
    
        <asp:SqlDataSource ID="SqlDataSource5" runat="server" ConnectionString="<%$ ConnectionStrings:SAADConneccion %>" SelectCommand="SELECT Tp.DESCRIPCION, P.TIPO 
        FROM PRODUCTO AS P
    	INNER JOIN TABLA AS Tp ON P.TIPO = Tp.CODIGO AND Tp.TABLA = 18
        WHERE P.TIPO NOT LIKE '0'
    	GROUP BY Tp.DESCRIPCION, P.TIPO">
            <SelectParameters>
                <asp:ControlParameter ControlID="DDL_TipoProducto" Name="TIPO" PropertyName="SelectedValue"/>
            </SelectParameters>
        </asp:SqlDataSource>
        
        <asp:SqlDataSource ID="SqlDataSource6" runat="server" ConnectionString="<%$ ConnectionStrings:SAADConneccion %>" SelectCommand="SELECT PR.NOMBRE, P.PROVEEDOR 
        FROM PRODUCTO AS P
    	INNER JOIN PROVEEDOR AS PR ON P.PROVEEDOR = PR.RUT
    	GROUP BY PR.NOMBRE, P.PROVEEDOR">
    		<SelectParameters>
            	<asp:ControlParameter ControlID="DDL_Proveedor" Name="PROVEEDOR" PropertyName="SelectedValue"/>
            </SelectParameters>
        </asp:SqlDataSource> 
    </asp:Content>

    Y por ultimo el procedimiento almacenado de la lista que mencioné en el codigo que traía problemas:

    @MARCA INT
    AS
    SELECT t.DESCRIPCION, P.MARCA
    
    FROM PRODUCTO AS P 
    
    INNER JOIN TABLA AS t ON P.MARCA = t.CODIGO AND t.TABLA = 16
        
    WHERE P.MARCA NOT LIKE '0'
    AND P.FAMILIA = @MARCA
    GROUP BY t.DESCRIPCION, P.MARCA

    Siendo esto lo que muestra al ejecutarlo y los datos que debería mostrar el dropdownlist, este depende de la SubFamilia de productos la cual deje comentada en el codigo.

    Por ejemplo si la familia de productos que se selecciona es CAFETERIA, y su subFamilia es jugos y nectar, la marca debería mostrar algo como esto:

    Siendo eso todo, quedo atento a sus comentarios gracias, si se requiere mayor información me avisan y yo la agrego sin ningún problema :)

    NOTA: Añado un detalle que me falto mencionar:

    Corresponde a la manera que lleno los 2 primeros dropdownlist, el primero se llena mediante una consulta contenida dentro de un procedimiento almacenado y el segundo depende de la selección de éste.

    protected void DDL_FamiliaProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            HddFamilia.Value = DDL_FamiliaProducto.SelectedValue;
            
            
            /*ESTE ES EL 2do QUE SE LLENA DEPENDIENDO 
            DE LA SELECCION DEL ANTERIOR*/
    
            DDL_SubFamiliaProducto.Items.Clear();
            DDL_SubFamiliaProducto.Items.Insert(0, new ListItem("---SELECCIONE---"));
    		
        }
    Lo mismo quiero hacer para el tercero que dependa de la selección del 2do, lo mismo para el 4to que depende del 3ro, y finalmente el 5to que depende de la selección del 4to, para mayor entendimiento del orden que me refiero (1°,2° 3°) se pueden guiar con la 1era imagen que puse.


    • Editado M4uriXD martes, 22 de mayo de 2018 21:50
    martes, 22 de mayo de 2018 21:41

Respuestas

Todas las respuestas

  • Hola, podrías revisar

    C# - [ASP.NET] DropDownList anidados


    Votar es agradecer.
    Saludos.
    Lima-Perú

    • Marcado como respuesta M4uriXD jueves, 24 de mayo de 2018 21:16
    martes, 22 de mayo de 2018 23:52
  • Lo que noto inmediatamente es que los SQL data sources tienen ID's de control que NO corresponden a los que usted muestra en el código.  Por ejemplo, el DDL de familia tiene ID DDL_CodigoFamilia, pero el parámetro en el SqlDataSource3 dice que el ControlID es HDDFamilia.  Igualmente veo la misma discrepancia para SqlDataSource4.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 23 de mayo de 2018 1:37
    Moderador
  • que como usaba procedimientos almacenados no capturaba el valor que le podía dar al dropdownlist mediante una consulta mas directa al seleccionar el comando en el sqlDataSource, por eso usaba HiddenFields y el ID de ese dropdownlist es DDL_FamiliaProducto

    • Editado M4uriXD miércoles, 23 de mayo de 2018 14:44
    miércoles, 23 de mayo de 2018 13:16
  • Si los SqlDataSource usan campos escondidos, muéstrenos el código que usa para transferir el valor seleccionado del DDL al Hidden field.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 23 de mayo de 2018 19:08
    Moderador
  • Ahora resulta que tengo el siguiente procedimiento almacenado, que aplica en esta linea de mi archivo aspx:

    <td>
      <asp:DropDownList runat="server" ID="DDL_MarcaProducto" DataSourceID="SqlDataSource4" DataTextField="DESCRIPCION" DataValueField="MARCA" AppendDataBoundItems="true">
    
        <asp:ListItem value="0" Text="--SELECCIONE--"></asp:ListItem>
    
      </asp:DropDownList>
    </td>
    
    
    <asp:HiddenField ID="HDDMarca" runat="server" Visible="true"/>
    
    <asp:HiddenField ID="HDDFamilia" runat="server" Visible="true"/>
    
    <asp:HiddenField ID="HDDSubFamilia" runat="server" Visible="true"/>
    
    
    <!--RESCATO LOS PARAMETROS DE LA BASE DE DATOS-->
    
    
    <asp:SqlDataSource ID="SqlDataSource4" runat="server" ConnectionString="<%$ ConnectionStrings:SAADConeccion %>"
    SelectCommand="OBTIENE_MARCAXSUBFAMILIA"
    SelectCommandType="StoredProcedure">
    
      <SelectParameters>
        
        <asp:ControlParameter ControlID="HDDMarca" Name="Marca"
         PropertyName="Value"/>
        
      </SelectParameters>
    
    </asp:SqlDataSource>
    
    <!-- ¿ ME FALTARÁ AGREGAR ALGO A ESTO ULTIMO ? -->
    <!-- ¿ O ASI ESTA BIEN ?-->
    
    

    Siendo este el procedimiento almacenado respectivo:

    ALTER PROCEDURE [dbo].[OBTIENE_MARCAXSUBFAMILIA] @MARCA INT, @FAMILIA INT AS SELECT T.DESCRIPCION AS 'FAMILIA',SF.DESCRIPCION AS 'SUB FAMILIA', T2.DESCRIPCION AS 'MARCA', P.FAMILIA AS 'ID FAMILIA',SF.ID_SUBFAMILIA AS 'ID SUBFAMILIA', T.CODIGO, T.TABLA, SF.ID_FAMILIA AS 'ID FAMILIA SUBFAMILIA' FROM PRODUCTO AS P,TABLA AS t, SUBFAMILIA AS SF, TABLA AS T2 WHERE P.FAMILIA = T.CODIGO AND T.TABLA = 3 AND T.CODIGO = @FAMILIA AND SF.ID_SUBFAMILIA = P.SUBFAMILIA AND SF.DESCRIPCION NOT LIKE '' AND SF.DESCRIPCION NOT LIKE '0' AND P.MARCA = T2.CODIGO AND T2.TABLA = 16 AND SF.ID_SUBFAMILIA = @MARCA GROUP BY SF.DESCRIPCION, T.CODIGO, T.TABLA, T.DESCRIPCION, P.FAMILIA, SF.ID_FAMILIA,

    T2.DESCRIPCION, SF.ID_SUBFAMILIA

    El cual me entrega el siguiente resultado:

    Como se puede ver me arroja la marca del producto según su familia y su subfamilia, para el caso de la marca se uso el valor del ID de la SubFamilia y para el caso de la familia se uso el Codigo de una Tabla llamada 'TABLA', el cual es el siguiente

    Donde el 9 corresponde a la FAMILIA de CAFETERIA, que es el que se usó en el ejemplo que les mostré al ejecutar el procedimiento almacenado.

    Y mi nueva interrogante es:

    ¿Como puedo tomar aquellos mismos valores pero de los DropDownList de la Familia y Subfamilia (respectivamente) y mostrar la MARCA en el DropDownList de la Marca?, sabiendo que tengo ese procedimiento almacenado, y que los valores se obtienen del ID de la subfamilia y del Codigo de la Tabla, ya que no podría tomar el valor del string sabiendo que tendría que convertir luego en el procedimiento almacenado para que funcione y no es la idea. 



    • Editado M4uriXD jueves, 24 de mayo de 2018 18:59
    jueves, 24 de mayo de 2018 18:32