Foros del Web » Programación para mayores de 30 ;) » .NET »

Valor inicial indicativo en un menú desplegable

Estas en el tema de Valor inicial indicativo en un menú desplegable en el foro de .NET en Foros del Web. Hola a [email protected]: En mis principios con el ASP.NET en C#, ya tengo una cuestión a plantear. Vamos a ver. Se tiene un menú desplegable ...
  #1 (permalink)  
Antiguo 30/01/2007, 13:55
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 17 años, 4 meses
Puntos: 3
Valor inicial indicativo en un menú desplegable

Hola a [email protected]:

En mis principios con el ASP.NET en C#, ya tengo una cuestión a plantear.

Vamos a ver. Se tiene un menú desplegable en una página que se va a rellenar con los datos de una tabla [GÉNEROS] de una base de datos en SQL Server.

Hasta aquí no hay problema, haciéndolo con el Visual Studio, en la vista diseño, se saca un control de DropDownList. Y luego en la parte de código, dentro del Page_Load, se hace la conexion y se establece la consulta SQL para sacar luego los datos deseados. Y se indica que los datos salgan por el menú desplegable.
También, por el panel de propiedades del DropDownList, se indica que como texto se saca el nombre del género y como valor el id de dicho género.

Este sería un ejemplo de código de lo comentado hasta ahora:
Código:
...
	protected System.Web.UI.WebControls.DropDownList menu_generos;

	private void Page_Load(object sender, System.EventArgs e)
	{
		// Introducir aquí el código de usuario para inicializar la página
		if (!Page.IsPostBack)
		{
			SqlConnection laConex = new SqlConnection("server=sp2400-102;database=db_videoclub;uid=sa");
			SqlDataAdapter elAdap = new SqlDataAdapter("SELECT gen_id, gen_nom FROM GENEROS ORDER BY gen_nom", laConex);
			DataSet elDs = new DataSet();

			try
			{
				laConex.Open();
				elAdap.Fill(elDs, "nombres_generos");
				menu_generos.DataSource = elDs.Tables["nombres_generos"].DefaultView;
				menu_generos.DataBind();
				laConex.Close();
			}
			catch(SqlException laEx)
			{
				Response.Write(laEx.Message);
			}
		}
	}
...

Código:
/* POR EL PANEL DE PROPIEDADES DEL DropDownList menu_generos */

DataTextField	>>  gen_nom
DataValueField	>>  gen_id

Hasta aquí, todo va bien en principio. La página muestra la lista de géneros que están registrados en su tabla, estando visible como primer elemento el primer género de dicha tabla.

Bueno pues ahora va la pregunta.
Si se quiere que el primer elemento de este menú no sea el primer registro resultante de la consulta efectuada, sino el típico elemento cuyo texto es [Seleccionar un género] ó simplemente una casilla en blanco, ¿cómo se programa esto para que salga dicho elemento?
Yo tengo más experiencia en ASP y en este antes de realizar el bucle que sacaba los datos de la consulta se puede insertar una primera etiqueta <option> Seleccionar género </option> con el texto y el valor deseados.

Pero en ASP.NET este menú no tiene la misma cosntrucción.
Código:
<asp:DropDownList id="menu_generos" style="Z-INDEX: 103; LEFT: 347px; POSITION: absolute; TOP: 98px" runat="server" DataTextField="gen_nom" DataValueField="gen_id"></asp:DropDownList>
Luego, ¿cómo puedo conseguir lo deseado?

Me han sugerido que como primer registro de la tabla, tuviera un elemento con ese texto [ Seleccionar género ] así ya tendría esa opción. Pero no me convence esta solución pues si pongo en la consulta el ORDER BY este elemento ya no saldría el primero.

Así que ¿alguna otra forma?

Espero se haya comprendido lo que quiero...
__________________
Saludos,

zacktagnan.
=================================================
  #2 (permalink)  
Antiguo 31/01/2007, 09:44
Avatar de reel  
Fecha de Ingreso: febrero-2004
Ubicación: Managua, Nicaragua
Mensajes: 496
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Valor inicial indicativo en un menú desplegable

Lo que te recomiendo es lo siguiente, luego de haber hecho el bind al DDL, agregues un elemento a la colección Items, y le pones como value un valor negativo de esa forma puede validar que hallan seleccionado un valor en el DDL.

Saludes
__________________
Leer es Saber, REEL.
Mi Blog
  #3 (permalink)  
Antiguo 31/01/2007, 15:31
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: Valor inicial indicativo en un menú desplegable

Gracias por la respuesta reel. Había encontrado una respuesta en Internet, dentro de la ayuda de Microsoft, y justo lo acabo de probar y es justo lo que quería.
Es digamos lo mismo que tu indicas.

El código encontrado viene de:

*versión VisualBasic
http://support.microsoft.com/?scid=kb;es;314334

* versión C#
http://support.microsoft.com/kb/312489/

Aunque en los dos casos, la forma de añadir un elemento al menú desplegable es igual (en C# terminando con ';')
menu_generos.Items.Insert(0, "<-- Seleccionar género -->")

Esta línea según indica en las direcciones mencionadas va después de haber aplicado los datos al menú y haber cerrado la conexión. Y después del .BInd como decías reel.

Empezando a contar desde cero, el primer parámetro del Insert indica la posición del elemento insertado.

Pues eso, ahí está a todo el que le pueda servir.

Y de nuevo gracias a reel por la respuesta aún y todo.
__________________
Saludos,

zacktagnan.
=================================================
  #4 (permalink)  
Antiguo 30/07/2007, 03:13
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: Valor inicial indicativo en un menú desplegable

Hola a [email protected]:

Mismo problema en otro contexto.

Ahora, para insertar nuevos usuarios, tengo un DetailView (enlazado a un SqlDataSource con un procedimiento para efectuar el inserto) y, en uno de sus campos, un DropDownList para elegir el perfil del nuevo usuario. Este DropDownList se enlaza a otro SqlDataSource con otro procedimiento para mostrar la lista de perfiles disponible.

Entonces, como he dicho, la cuestión es la misma: cargar un elemento inicial en el DropDownList de los perfiles. Inicialmente he hecho algo parecido al problema anterior pero no me da el mismo resultado

Este es el código que he puesto en la parte .aspx.cs:
Código:
    protected void Page_LoadComplete(object sender, EventArgs e)
    { 
        DropDownList listaPerfiles = DetailsView_insUsu.FindControl("DropDownList_perfiles") as DropDownList;
        listaPerfiles.DataBind();//CON ESTA DA ERROR
        listaPerfiles.Items.Insert(0, "elegir uno");//ESTA EN NINGÚN MOMENTO SE APLICA
        listaPerfiles.SelectedIndex = 3;//ESTA SI FUNCIONA
    }
Poniendo así, con la línea del DataBind(), el navegador me muestra este error:
Código:
Detalles de la excepción: System.InvalidOperationException:
Los métodos de enlace de datos como Eval(), XPath() y Bind() sólo se pueden utilizar en el contexto de un control de enlace de datos.
Luego, ¿alguna idea de cómo solucionar esto y poner un elemento inicial en el DropDownList del DetailView?

Se agradece toda sugerencia...
__________________
Saludos,

zacktagnan.
=================================================
  #5 (permalink)  
Antiguo 30/07/2007, 03:30
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: Valor inicial indicativo en un menú desplegable

Bueno, ya he encontrado la respuesta...

Lo que produce que salga el error de excepción comentado es la línea del DataBind()

Otra cosa que me faltaba, aparte del texto, es darle el valor al nuevo elemento.

El formato correcto para construir el nuevo Item del DropDownList sería:
Código:
DropDownList_Nombre.Items.Insert(0, new ListItem("texto", "valor"));
Entonces, queda así:
Código:
    protected void Page_LoadComplete(object sender, EventArgs e)
    { 
        DropDownList listaPerfiles = DetailsView_insUsu.FindControl("DropDownList_perfiles") as DropDownList;
        
        listaPerfiles.Items.Insert(0, new ListItem("elegir uno", "0"));
        listaPerfiles.SelectedIndex = 0;//PARA QUE QUEDE SELECCIONADA LA NUEVA OPCIÓN INTRODUCTORIA
    }
solución sacada de otro mensaje del foro, dada por el excelente moderador RootK:
http://www.forosdelweb.com/showthrea...t=DropDownList

Pues nada, solucionado de nuevo, para todo el que le pueda servir...
__________________
Saludos,

zacktagnan.
=================================================

Última edición por zacktagnan; 30/07/2007 a las 07:25
  #6 (permalink)  
Antiguo 03/08/2007, 14:26
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: Valor inicial indicativo en un menú desplegable

Bueno he encontrado de introducir el elemento inicial.

Lo sugerido en las anteriores respuestas son válidas tanto para el ASP.NET 1.1 como para el ASP.NET 2.0 .

Pero en éste último, hay otra opción de hacer lo mismo sin tener que insertar nada en la parte de código, y haciéndolo desde la parte de diseño del Visual Studio 2005.

Buscando una cosa en el Google, me topé con esta página que lo explica con detalle:

http://geeks.ms/blogs/lruiz/archive/...ounditems.aspx

Espero que le sirva a alguien...
__________________
Saludos,

zacktagnan.
=================================================
  #7 (permalink)  
Antiguo 11/09/2007, 01:32
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: Valor inicial indicativo en un menú desplegable

* Nueva versión del mismo problema *

Si ahora al menú desplegable (DDL_contactosClie) al que quiero ponerle el elemento inicial es uno que se carga a través de un SqlDataSource que recibe un ControlParameter de otro menú desplegable (DDL_clientes), ¿cómo podría entonces ponerle al (DDL_contactosClie) ese elemento inicial?

Código:
<asp:DropDownList ID="DDL_clientes" runat="server" DataSourceID="SqlDs_clientesCCRep"
DataTextField="clie_nom" DataValueField="clie_id" SelectedValue='<%# Bind("avis_clieid") %>' AutoPostBack="True" OnSelectedIndexChanged="DDL_clientes_SelectedIndexChanged" AppendDataBoundItems="True" CssClass="ecograscomponentdata_seleccClientes">
   <asp:ListItem Value="0">---------------------</asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDs_clientesCCRep" runat="server" ConnectionString="<%$ ConnectionStrings:ecogras_conexion %>"
SelectCommand="spSelec_Clientes" SelectCommandType="StoredProcedure"></asp:SqlDataSource>

...

<asp:DropDownList ID="DDL_contactosClie" runat="server" DataSourceID="SqlDs_contactosClie"
DataTextField="contcli_nom_apell" DataValueField="contcli_nom_apell" AutoPostBack="True" OnSelectedIndexChanged="DDL_contactosClie_SelectedIndexChanged" OnLoad="DDL_contactosClie_Load" AppendDataBoundItems="True">
   <asp:ListItem Selected="True">** Sin contactos **</asp:ListItem>
</asp:DropDownList>
 <asp:SqlDataSource ID="SqlDs_contactosClie" runat="server" ConnectionString="<%$ ConnectionStrings:ecogras_conexion %>"
 SelectCommand="spSelec_ContactosXClie" SelectCommandType="StoredProcedure" OnLoad="SqlDs_contactosClie_Load">
   <SelectParameters>
      <asp:ControlParameter Name="clie_id" ControlID="DDL_clientes" propertyname="SelectedValue" />
      <asp:Parameter DefaultValue="0" Direction="InputOutput" Name="totContactClie" Type="Int32" />
   </SelectParameters>
</asp:SqlDataSource>
Según el código que he puesto, en el menú DDL_contactosClie lleva la propiedad AppendDataBoundItems="True", la cuál permite poner ese valor inicial (aquí "** Sin contactos **") y funciona bien si no se cambia de cliente en el menú DDL_clientes. Pero si cambio de cliente, al tener habilitada la mencionada propiedad no me actualiza del todo los registros del menú DDL_contactosClie sino que me añade los contactos del cliente ahora seleccionado a los del anterior.

He probado a quitar esa propiedad del AppendDataBoundItems y <asp:ListItem... del HTML y añadir dinámicamente desde la parte de código el elemento inicial de la siguiente forma ...

Código:
        DropDownList _DDL_contactosClie = DV_avisoCCRep.FindControl("DDL_contactosClie") as DropDownList;
        _DDL_contactosClie.Items.Insert(0, new ListItem("** Sin contactos **", "0"));
... pero no me hace caso porque, creo, como ya he dicho el SqlDataSource se carga a través del ControlParameter mencionado.

En principio, he probado esto último en los Load de la Página, del propio menú, pero nada...

Espero alguien me dé una reseña para solucionarlo u otra forma de conseguir lo mismo...
__________________
Saludos,

zacktagnan.
=================================================
  #8 (permalink)  
Antiguo 27/10/2008, 05:09
 
Fecha de Ingreso: marzo-2008
Mensajes: 65
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Valor inicial indicativo en un menú desplegable

hola, me pasa exactamente lo mismo que a ti, lo conseguiste solucionar? serias tan amable de indicarme como?? muchisimas gracias.
  #9 (permalink)  
Antiguo 08/06/2009, 19:44
 
Fecha de Ingreso: abril-2006
Ubicación: Santiago ,Chile
Mensajes: 169
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Valor inicial indicativo en un menú desplegable

Cita:
Iniciado por nenure Ver Mensaje
hola, me pasa exactamente lo mismo que a ti, lo conseguiste solucionar? serias tan amable de indicarme como?? muchisimas gracias.

Hola, tengo el mismo problema lo explico en este tema


http://www.forosdelweb.com/f78/probl...wnlist-705711/
  #10 (permalink)  
Antiguo 03/03/2011, 05:35
 
Fecha de Ingreso: diciembre-2010
Mensajes: 4
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Re: Valor inicial indicativo en un menú desplegable

gracias por la indicacion Zack, me has ahorrado un rato ;)

Cita:
Iniciado por zacktagnan Ver Mensaje
Bueno he encontrado de introducir el elemento inicial.

Lo sugerido en las anteriores respuestas son válidas tanto para el ASP.NET 1.1 como para el ASP.NET 2.0 .

Pero en éste último, hay otra opción de hacer lo mismo sin tener que insertar nada en la parte de código, y haciéndolo desde la parte de diseño del Visual Studio 2005.

Buscando una cosa en el Google, me topé con esta página que lo explica con detalle:

[URL="http://geeks.ms/blogs/lruiz/archive/2007/03/05/asp-net-2-0-la-propiedad-appenddatabounditems.aspx"]http://geeks.ms/blogs/lruiz/archive/2007/03/05/asp-net-2-0-la-propiedad-appenddatabounditems.aspx[/URL]

Espero que le sirva a alguien...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:23.