domingo, 20 de junio de 2010

ComboBox - DropDownList – Opción “Todos”

 

Introducción

En algunas situaciones se requiere agregar un ítem especial a los controles, como ser en controles del tipo combo, para que el usuario tenga la posibilidad de indicar que no hay un ítem escogido de la lista.

Esto se usa especialmente en circunstancias en donde el campo que representa el combo es opcional, o se quiere inicializar en un ítem que obligue al usuario a elegir un valor de la lista.

Es por esto que según cual sea la funcionalidad del combo, si actuara como filtro, o como lista con obligación de selección del usuario, es que tendrás distintas leyendas.

Si es un filtro podrías decir: “<Todos los items>”, o sea que no se aplicaría el ítem como filtro, o si el control actual sin una selección por defecto podrías decir: “<Seleccione un ítem de la lista>”, por supuesto este ultimo caso se validaría haya elegido un ítem.

En el articulo se intentara explicar las forma en que es posible añadir un ítem extra a los controles ya sea WinForms o Web.

 

WinForms ComboBox

El combobox de una aplicación estilo “Windows Application” puede recibir como origen de datos diferentes fuentes, podrías ser una clase especifica creada por uno, o podrías ser un dataset. Según cual sea el origen de datos cambia la solución que debe aplicarse para agregar este ítem extra opcional de la lista, ya que será el origen de datos donde se agrega la opción especial.

Agregar opción usando clases creadas por uno

En el ejemplo se ha definido una clase de nombre “Producto”, es muy simple, solo cumple la función de definir la información que necesitas el control.

public class Producto
{
    public string Descripcion { get; set; }
    public int Id { get; set; }
    public int Precio { get; set; }
}

El código que carga una lista de tipo Producto y la asigna como origen de datos al combo, es el siguiente:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        
        cbProductos.ValueMember = "Id";
        cbProductos.DisplayMember = "Descripcion";
        cbProductos.DataSource = ObtenerListItemOpcional();

    }

    private List<Producto> ObtenerListItemOpcional()
    {
        List<Producto> listproductos = ObtenerLista();

        listproductos.Insert(0, new Producto() { Id = 0, Descripcion = "<Seleccione un Item>", Precio = 0 });

        return listproductos;
    }

    private List<Producto> ObtenerLista()
    {
        return new List<Producto>()
        {
            new Producto(){ Id = 1, Descripcion = "Notebook HP Athlon Neo MV-40", Precio = 3100},
            new Producto(){ Id = 2, Descripcion = "Notebook ASUS ATOM N450", Precio = 2300},
            new Producto(){ Id = 3, Descripcion = "Notebook ACER N270", Precio = 2000},
            new Producto(){ Id = 4, Descripcion = "Notebook SONY Atom TM", Precio = 2600},
            new Producto(){ Id = 5, Descripcion = "Notebook DELL SU 4100", Precio = 3400},
            new Producto(){ Id = 6, Descripcion = "Notebook ASUS Core i3", Precio = 4500}
             
        };
    }
}

La línea clave en donde se agrega el ítem que permitirá la selección opcional es:

listproductos.Insert(0, new Producto() { Id = 0, Descripcion = "<Seleccione un Item>", Precio = 0 });

Lo importante a remarcar es como el modelo original de datos no es alterado, pudiéndose cargar, si se necesita, un combo simple sin un ítem adicional, se maximiza la reutilización de los métodos separándolos según agregue o no el ítem opcional.

Agregar opción usando un DataTable

En este caso se usara un datatable cuya estructura será definido en runtime, la clave aquí esta en el método ObtenerListItemOpcional() donde se crea la nueva fila en tiempo de diseño.

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        cbProductos.DisplayMember = "Descripcion";
        cbProductos.DataSource = ObtenerListItemOpcional();
    }

    private DataTable ObtenerListItemOpcional()
    {
        DataTable listproductos = ObtenerLista();

        DataRow row = listproductos.NewRow();
        row["Id"] = 0;
        row["Descripcion"] = "<Seleccione un Item>";
        row["Precio"] = 0;
        
        listproductos.Rows.InsertAt(row, 0);

        return listproductos;
    }

    private DataTable ObtenerLista()
    {
        DataTable dt = new DataTable();

        dt.Columns.Add("Id");
        dt.Columns.Add("Descripcion");
        dt.Columns.Add("Precio");

        DataRow row = dt.NewRow();
        row["Id"] = 1;
        row["Descripcion"] = "Notebook HP Athlon Neo MV-40";
        row["Precio"] = 3100;
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Id"] = 2;
        row["Descripcion"] = "Notebook ASUS ATOM N450";
        row["Precio"] = 2300;
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Id"] = 3;
        row["Descripcion"] = "Notebook ACER N270";
        row["Precio"] =  2000 ;
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Id"] = 4;
        row["Descripcion"] = "Notebook SONY Atom TM";
        row["Precio"] = 2600;
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Id"] = 5;
        row["Descripcion"] = "Notebook DELL SU 4100";
        row["Precio"] = 3400;
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Id"] = 6;
        row["Descripcion"] = "Notebook ASUS Core i3";
        row["Precio"] = 4500;
        dt.Rows.Add(row);

        return dt;
    }
}

 

En caso de usar un dataset tipado, la técnica es la misma solo que se dispondrá de método específicamente creados por el dataset en tiempo de diseño, en el ejemplo no se contemplo este caso, pero ante la necesidad de usarlo podría ser algo como lo siguiente:

private dtoProducto.ProductosDataTable ObtenerListItemOpcional()
{
    dtoProducto.ProductosDataTable dt = ObtenerLista();

    dtoProducto.ProductosRow row = dt.NewProductosRow();
    row.Id = 0;
    row.Descripcion = "<Seleccione un Item>";
    row.Precio = 0;
    dt.Rows.Add(row);

    return dt;
}

Es prácticamente idéntico solo que hay método especiales, por ejemplo, NewProductosRow() y los campos estas tipados en propiedades.

 

[C#]
[VB.NET]

 

ASP.NET DropDownList

La técnicas usadas para añadir un ítem a los controles web, difieren bastante de las usadas en una aplicación winforms.

Tomemos de ejemplo el siguiente html

    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DropDownList1" runat="server">
        </asp:DropDownList>
        
        <br/>
        <br/>
        
        <asp:DropDownList ID="DropDownList2" runat="server" AppendDataBoundItems="true">
            <asp:ListItem Value="0">&lt;Seleccione un Item&gt;</asp:ListItem>
        </asp:DropDownList>
    </div>
    </form>

Este solo contiene dos controles de lista, pero hay una diferencia entre ellos, el segundo hace uso de una propiedad especial que le permite añadir un ítem definido en código html del mismo, me refiero al AppendDataBoundItems="true"

Si ahora se analiza el código .net usado para cargar cada lista

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DropDownList1.DataSource = ObtenerLista();
        DropDownList1.DataTextField = "Descripcion";
        DropDownList1.DataValueField = "Id";
        DropDownList1.DataBind();

        DropDownList1.Items.Insert(0, new ListItem("<Seleccione un Item>", "0"));


        DropDownList2.DataSource = ObtenerLista();
        DropDownList2.DataTextField = "Descripcion";
        DropDownList2.DataValueField = "Id";
        DropDownList2.DataBind();
    }

}

Para el primer dropdownlist se ha agregado el ítem programáticamente usando el método Insert(), indicando en el primer parámetro que el valor estará ubicado en la primer posición.

Mientras que el segundo no requiere del agregado de nada especial, el ítem se había definido en el html.

 

[C#]
[VB.NET]

Conclusión

Si se compara las técnicas usadas para cargar el ComboBox de una aplicación WinForms y el DropDownList de una aplicación asp.net, se notara rápidamente que el primer caso el ítem adicional se agrega a los datos antes de bindear el control

Mientras que el el desarrollo con asp.net permite agregar un ítem directo al control, ya sea que se defina el en html, o se use el Insert() en su colección de ítems

74 comentarios:

  1. Leandro
    Te saludo
    Una consulta, que no tiene que ver mucho con el tema , solo que no se donde ponerla.
    Quiero pasar datos de un formulario a otro y lo estoy declarando como una variable de referencia lo cual me funciona en vb asi
    Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim fr As Form1 = Form1

    If (fr.clave = "a") Then
    ComboBox2.Enabled = False
    Else
    ComboBox2.Enabled = True

    End If

    End Sub


    me funciona en vb
    lo que no se es como hacer esta declaracion
    Dim fr As Form1 = Form1
    en c#
    no necesito un nuevo objeto sino
    capturar lso datos del formulario
    podrías ayudarme con eso??
    Muchas Gracias

    ResponderEliminar
  2. hola Augusto

    La linea que mencionas se traduce a c# de la siguiente manera:

    Form1 fr = Form1

    Aunque esa linea hasta en vb me suena extraña ya que Form1 es la clase de tu formulario, si es asi donde estas tomando la instancia del otro form para asignarla, a esta variable de nombre "fr" que estas declarando.

    por ahi se revisas estos otros articulos podrian ayudarte:

    Comunicar formularios de forma desacoplada

    o quizas

    [WinForms] – Pasaje de información formulario hijo


    Te recomendaria ademas que des una vuelta por el foro de c#, alli podrias plantear las dudas que tengas:
    Foro C#


    saludos

    ResponderEliminar
  3. Hola Leandro,
    queria agradecerte por la respuesta anterior.
    Además tengo otra consulta,debo trabajar con Winsock en vb 2005 y no se como ubicarlo.He visto que en versiones como visual basic 6.0 simplemente se jala del cuadro de herramientas un icono como de dos pequeñas pc's, pero en el vb 2005 no se como se trabaja,por otro lado he visto que a veces solo lo instancian en el código en el vb 2005 , es así como se trabaja?.No se si podrás darme una ayuda al respecto.Gracias.
    Saludos.

    ResponderEliminar
  4. hola Augusto

    En realidad es mas una pregunta para un foro, el cual recomiendo:

    Foro c#

    que para este articulo del blog.

    Bien el tema es que el control Winsock ya no existe en .net, ahora se usa la funcionalidad que encontraras bajo el namespace:

    System.Net.Sockets

    Ejemplos de código de socket

    Esta es muchisimo mas amplia que el control de VB6 y mas flexible.


    saludos

    ResponderEliminar
  5. Leandro,

    una consultita...
    cuando se habla de insertar "programáticamente"
    a qué se refiere?
    es q siempre lo he leído pero aun no entiendo.
    y cuál es la palabra contraria a hacerlo programaticamente?

    gracias..

    ResponderEliminar
  6. hola LiZzY

    "programaticamente" hace referencia a una operacion que realizas desde codigo, o sea que tu mismo en tu programa agregaras las lineas de codigo necesarias para llevar a cabo esa operacion.

    En el articulo lo que queria diferenciar es que al bindear los datos del combo no estas creando los items programticamente, lo hace el biding por ti, en cambio ese item adicional en particular si lo agregas explicitamente.

    saludos

    ResponderEliminar
  7. Hola Buenas Leandro, queria ver si podias ayudarme con algo pequeño, soy nuevo en esto de VB y me ha costado un monton encontrar la forma de hacer lo siguiente.

    necesito un menu de tipo DropDownlist con dos opciones que al seleccionarlas cambien el valor de una de las "My.Settings..." que he creado de antes.

    se que es mucho el abuso pero realmente tienes una capacidad increible.. que no todos poseemos.

    bueno de antemano muchas gracias.

    ResponderEliminar
  8. hola FEX

    La verdad no estoy tan seguro que en un entorno web el My.Setting aplique para su uso, por ahi si usas el web.config sea mas acertado.

    El My.Setting lo asocio mas a configuracion en aplicaciones de escritorio, no una web, o al menos yo no vi usado en ningun sitio.

    por ahi estos link ayuden

    Using My.Settings in Visual Basic 2005

    Application settings in VB.NET 2.0 and Visual Studio 2005

    Igualmente si necesitas podrias hacer la pregunta en el foro de MSDN

    Foro asp.net

    saludos

    ResponderEliminar
  9. hola buenas, de nuevo.. gracias por responder mi pregunta, eres muy amable

    me han quedado algunas dudas respecto a tu respuesta... digamos que no se a que te refieras con "entorno web".. lo que estoy haciendo yo lo definiría como aplicación de escritorio.

    se como cambiar las "My.settings" solo basta con agregar un signo igual "=" para cambiar sus valores. Ej:

    para la cambiar el valor de la configuración de idioma a 1 seria:

    My.settings.idioma = 1

    el problema es que no se como agregar esta función a una opcion en un menú de tipo DropDownList...

    PD: tal vez estoy utilizando mal la palabra DropDownList, aunque no se mucho de esto creo que se le llama así a un menú que se despliega al pinchar en la flecha que tiene a la derecha.

    una vez mas muchas gracias por la ayuda.

    ResponderEliminar
  10. hola FEX

    Claro de ahi viene la confusion, como comentaste sobre un DropDownList y este es el combo de asp.net, al leer esto imagine estabas en un proyecto web.
    En las aplicaciones winforms es simplemente ComboBox.

    Bien en ese caso para cambiar el valor podrias usar el evento del propio combo, puntualmente el evento:

    SelectionChangeCommittedz

    en este podrias hacer

    Private Sub comboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As EventArgs) Handles comboBox1.SelectionChangeCommitted

    My.settings.idioma = comboBox1.SelectedValue

    End Sub

    Aqui supongo que los values del combo devolveran el numero que quieres asignar a la configuracion del idioma.


    saludos

    ResponderEliminar
  11. Muchas gracias creo que esto es lo que necesitaba.. bueno en realidad aun no me funca... ya que, al darle al botón aceptar el programa debe reiniciarse para así cargar las opciones de configuración de idioma.

    el método:

    My.settings.idioma = comboBox1.SelectedValue

    no me da error.. pero al añadir un:

    My.Settings.Save()

    (que es para que guarde la configuración en el registro del programa y asi mantener esta después del reinicio)

    me da un error:

    la conversión de la cadena "" en el tipo 'Double' no es valida.

    bueno ahora es mi turno buscar la soluciona esto.. así que no te preocupes muchas gracias por todo has sido muy amable. bye!

    ResponderEliminar
  12. Leandro
    Buen dia, el enlace esta roto para descargar el codigo de c#, y gracias por tu gran trabajo de compartir.

    ResponderEliminar
  13. hola demonical

    Que raro, intente recien descargar los ejemplos y pude hacerlo sin problemas.

    Quizas habra sido algo temporal en el servicio de skydrive.

    Por ahi pida autenticacion con una cuenta de passport o hotmail para que puedas acceder, intenta tambien ingresar con el IE, por ahi tenga problemas otros browsers, igual es raro, pero para descartar que no sea este el inconveniente.

    saludos

    ResponderEliminar
  14. Leandro
    Buen día, y nuevamente gracias por el gran aporte que haces a la programación, Descargado sin problemas Saludos.

    ResponderEliminar
  15. Leandro
    Buen Dia
    Tengo un Dropdownlist que lo cargo desde el evento load haciendo una consulta de la base de datos(sql), al hacer click en el primer item del dropdownlist no me realiza la consulta para cargar el 2° dropdownlist, necesito clickear en cualquier otro item para que ahora si pueda clickear en el primero y hacer la consulta, ¿como puedo hacer para que se realiza la consulta al seleccionar primero el primer item del dropdownlist?

    ResponderEliminar
  16. Leandro
    Primero te saludo por tu excelente aporte y me gustaria saber como cargar un combobox en c# en windows form desde una bd sql tanto usando dataset o de alguna otra forma,recien me estoy iniciando en el mundo del codigo y no e pillado ejemplos claros como cargar un combobox
    Saludos Cordiales

    ResponderEliminar
  17. hola Chipujin

    el tema es que el evento que usas seguramente se trate del SeelctedIndexChanged o SelectionChangeCommited

    ambos evento solo se lanzan ante un cambio en la seelcion, desplegar el combo para elegir el mismo item no representa un cambio

    quizas debas usar algun evento alternativo como ser

    DropDownClosed

    con este si tendras el evento al cerrar el desplegable sin que haya cambiado la seleccion

    saludos

    ResponderEliminar
  18. hola Gonzalo

    podria ser algo como esto


    string connstring = "connection string";
    using (SqlConnection conn = new SqlConnection(connstring)) {

    string query = "Select Id, Nombre From NombreTabla";
    SqlCommand cmd = new SqlCommand(query, conn);

    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);

    ComboBox1.DisplayMember = "Nombre";
    ComboBox1.ValueMember = "Id";
    ComboBox1.DataSource = dt;

    }

    saludos

    ResponderEliminar
  19. uso el evento SelectedIndexChanged, el evento que me comentas no me aparece en la tabla de eventos del visual studio 2008, tenia la idea de agregar un item manaualmente en la posición "0" del componente pero no me gusta mucho la idea y queria saber si habia alguna otra forma de poder hacerlo...
    Gracias por tu Respuesta...

    ResponderEliminar
  20. hola Chipujin

    pero que control estas usando? es un combobox
    cual es el evento que comento y no puedes visualizar?

    has revisado el articulo, porque si estas vinculando el control a un origen de datos, no puede agregarlo directo

    cuando dices componente sigues refiriendote a un combobox ?

    saludos

    ResponderEliminar
  21. es un dropdownlist y lo enlazo mediante una consulta sql para cargar los datos, en los eventos del dropdownlist no aparece el evento dropdownclosed.
    el evento en el que hago la consulta para cargar los datos en el dropdownlist se llama SelectedIndexChanged.
    Gracias por tu Respuesta.

    ResponderEliminar
  22. hola Chipujin

    ahh ok era un desarrollo web, no se porque pense que era winforms por eso apunte a un combobox

    mm me temo que en ese caso lo unico que se me courre es que con ayuda de jquery (o sea javascript) detectar el evento en el cliente (aunque no estoy seguro que se exponga alguno) y realizar un __doPostBack() del evento

    saludos

    ResponderEliminar
  23. Soy Nuevo en esto de la programación y no se como hacer eso que me dices, si me pudieras poner un ejemplo te lo agradecería.
    saludos.

    ResponderEliminar
  24. Leandro mi problema consiste en que yo tengo programado un evento llamado from_activated en el cual al cerrar el form hijo el cobo se actualiza con el cambio que hice en el form hijo, pero el form padre que contiene el from cuando se activa de nuevo me elije el primer item del combo y validando el texto me deja pasar todo no valida

    ResponderEliminar
  25. este es elevento
    Private Sub Form_Orden_Compra_Activated(sender As Object, e As System.EventArgs) Handles Me.Activated
    Tbl_proveedoresTableAdapter.ClearBeforeFill = True
    Tbl_proveedoresTableAdapter.Update(Me.OVISA_DBDataSet.tbl_proveedores)
    Tbl_proveedoresTableAdapter.Fill(Me.OVISA_DBDataSet.tbl_proveedores)
    Me.ComboBox1.Text = "[Elija Opción]"
    End Sub

    ResponderEliminar
  26. ese evento al cerrar el form hijo donde creo proveedores me actualiza el dataset alcual esta vinculado el combo proveedores del from padre, pero lo que quiero es que al actualizarlo como me vuelve a armar los items quiero que me devuelva a "[elija opcion]" porque asi lo valido que si el texto del comobo es "[elija opcion]" que me diga elija provedor, eso bien todo el problema que cuando me sale el msgbox el form padre se desactiva verdad, y al cerrar el msgbox se vuelve a activar el form padre autoeligiendome el primer item del combo y eso no me deja validad a la hora de guardar .....gracias

    ResponderEliminar
  27. y he puesto en el load combo1.text"[elija opcion]" peor no lo muestra siempre se auto selecciona el primer item de ese combo eso pasa en todos los enlazados a dataset, la verdad necesito algo que me devuelva elija opcion como item del combo y asi que obligue al usuario a volver a elejir proveedor

    ResponderEliminar
  28. hola MIND CORRUPTER

    no entendi que quieres hacer, primero pareciera que son el form padre y un form hijo, pero despues comentas que se trata de un messagebox, eso me confundio

    despues usar el evento Activate para lo que planteas no me parece correcto

    no se como has implementado la validaciones, pero si es con el evento Validating es logico que el messagebox no debas usarlos

    saludos

    ResponderEliminar
  29. FOM_COMPRAS(PADRE) DESDE ESTE FORM ABRO FORM_PROVEEDORES (FROM HIJO), CUANDO CREO UN PROVEEDOR Y CIERRO EL FORM_PROVEEDOR, EL EVENTO ACTIVATE DE FORM_COMPRAS(PADRE) ACTUALIZA EL DATASET DEL COMBO PROVEEDORES QUE ESTA EN FROM_COMPRAS(PADRE), EL PROBLEMA ES QUE CUANDO HAY UN MSG DE VALIDACION EL EVENTO ACTIVATE SEVUELVE A CORRER COMO ES DE ESPERARSE, LO QUE QUERIA SABER ES COMO INICIALIZAR EL COMBO PROVEEDORES ENLAZADO A UNA TABLA CON TEXTO [ELIJA OPCION] CADA VEZ QUE ELEVENTO ACTIVATE CORRE POR UN MSGBOX...GRACIAS

    ResponderEliminar
  30. LA VERDAD QUE QUITE ELEVENTO Y SOLO VALIDO CON ERROR PRVIDER PORQUE SI EL USUARIO OLVIDA LLENAR UN CAMPO REQUERIDO LA VALIDACION VIENE DADA POR MSGBOX, PERO ESO HACE CORRER EL EVENTO ACTIVATE CADA VES QUE EL FORM SE DESACTIVA Y SE ACTIVA POR UN MSGBOX O LA APERTURA Y CIERRE DE UN FORM HIJO VERDAD, CAUSANDO QUE EL COMBO PROVEEDORES EN ELCUAL YO YA HABIA ELEGIDO UN ITEM SE VUELVA A DIBUJAR Y ME ELIJE SIEMPRE EL PRIMER ITEM DE LA LISTA

    ResponderEliminar
  31. NO SE PORQUE HACE ESO
    YO EN EL LOAD DEL FORM LE HE PUESTO COMBO1.TEXT = "[ELIJA OCION]" Y SI LO MUESTRA PERO EL COMBO YA HA SELECCIONADO AUTOMATICAMENTE EL PRIMER ITEM DE LA LISTA, NO SE PORQUE, Y SI EVALUO QUE EL COMBOTEXT TENGA ESTO "[ELIJA OCION]" ME AVISARIA QUE TENGO QUE ESCOGER OPCION, PERO EL COMBO YA TIENE EL VALOR DEL PRIMER ITEM, Y CUANDO GUARDO LOS DATOS DEL FORM ME GUARDA "[ELIJA OCION]"

    ResponderEliminar
  32. TAMBIEN PROVE METER EL CODIGO QUE ACTUALIZA EL DATASET DE COMBO PROVEEDORES EN EL BOTON CERRAR DEL FORM_PROVEEDORES(HIJO), PERO NO LO ACTUALIZA LA VERDAD QUE EL EVENTO ACTIVATE ES EL MEJOR, PERO NO PARA LO QUE YO QUIERO. GRACIASSS LEANDRO POR TU AYUDA.

    ResponderEliminar
  33. LA VALIDACIONES SON SIMPLES IF EVALUANDO LOS CONTENIDOS DE LOS TEXTBOX Y COMBOS, ENVIANDOLES MSGBOX DE ADVERTENCIA, PERO COMO DESACTIVAN EL FOMR PADRE Y AL CERRAR MSGBOX SE VUELVE A ACTIVAR EL PADRE VUELVE A CORRER EL VEENTO ACTIVATE.

    ResponderEliminar
  34. hola MIND CORRUPTER

    un tema no seria mejor evaluar este problema en el foro, porque la explciacion es largo y los comentarios en el blog no se dejan explicar muy bien

    foro vb.net


    igualmente si quieres comunciar formulario no uses el activate para recargar o realizar una accion

    usa algo como esto

    Comunicar formularios de forma desacoplada


    o sea antes de cerrar el form hijo invocas al metodo que defines en el form padre para actualizar el combo o realizar determinada accion

    saludos

    ResponderEliminar
  35. Leandro un saludo, primero que nada por que tu blog es muy bueno e informativo.
    Ahora la consulta, tengo un dataset con una conexion a access con la cual deseo llenar el combobox pero la verdad viendo tu ejemplo no me queda claro como seria en el caso de usar un dataset.. .no se si me puedes ayudar un poco o en que punto enfocarme, conste estoy algo nuevo en esto del VB asi que perdon si la pregunta te parece confusa o demasiado boba, igual gracias

    ResponderEliminar
  36. hola Bianconeri

    es que a un combobox no lo vinculas a un dataset, lo haces a un datatable, los controles solo pueden asignarse a un unico datatable

    o el problema es que no conoces como cargar el datatable? porque si lo cargas con el dataadapter usando el Fill() solo quedaria asignar este al DataSource del combo

    saludos

    ResponderEliminar
  37. Excelente explicación Leandro, gracias.. llevaba buscando como hacer esto en winforms ligual que lo hago en asp.net y no daba como

    ResponderEliminar
  38. muy ytil el post, pero como hago para un dropdownlist que ya esta vinculado a un datasource de donde saca los datos? y como añado "seleccione uno" si ya viene cargado? muchas gracias

    ResponderEliminar
  39. hola David

    me pregunto, leiste el articulo completo? porque me parece rara la pregunta si es que entendiste lo que se propone

    analizaste usar el AppendDataBoundItems="true"

    saludos

    ResponderEliminar
  40. Gracias leandro por todos tus aportes me han servido de mucho

    ResponderEliminar
  41. Muchas gracias Leandro por todos tus buenos aportes me han servido de mucho en mi desarrollo como profesional "MUCHAS GRACIAS"

    ResponderEliminar
  42. Buenos mdías Leandro, la verdad es que este ejemplo es el que necesito, pero me estoy volviendo loco como llegar a los datos guardados, por ejemplo, al precio. Lo veo cuando le hago el debug, pero no llego a tomarlo.
    Imagino que debe ser una pavada, pero estoy bloqueado y no lo veo.
    Gracias y saludos
    Esteban

    ResponderEliminar
  43. hola esteban

    la verdad no encuentro relacion entre este ejemplo y el planteo que realizas sobre el precio

    si usas el SelectedValue del combo imagino tendrias el id de la entidad y con este realizar un query para recuperar los otros campos incluido el precio

    saludos

    ResponderEliminar
  44. Hola Leandro, en numerosas ocasiones me haz sacado de apuros con tus apuntes y consejos y te lo agradezco infinitamente, acudo a ti porque actualmente tengo el siguiente problema, tengo un dropdownlist en asp.net, estoy bajo VB.NET, lleno mi combo con varios datos pero no consigo guardar en una variable el dato que selecciono del combo, siempre me guarda el primer elemento de la lista, me puedes ayudar?

    ResponderEliminar
  45. hola Luis

    el dropdownlist lo cargas en el Page_Load' porque si es asi recuerda que debes validar el IsPostBack o sea

    If Not IsPostBack Then
    'aqui cargas el combo
    End If

    sino lo validas cada evento lo volvera a cargar perdiendo la seleccion del usuario

    saludos

    ResponderEliminar
  46. Hola leandro, gracias por la respuesta, el combo lo cargo en el evento textchanged, dependiendo de lo que se escriba se cargan los elementos de la lista

    ResponderEliminar
  47. hola Luis

    nada esta causando algun redirect, que pudiera estar recargando la pagina

    si pones en el page_load la validacion de ispostback puedes ver que se comporta diferente cuando ingresas la primera vez y cuando se lanza un evento

    saludos

    ResponderEliminar
  48. Leandro
    saludos
    disculpa me podrias ayudar con esto:
    tengo un textbox y un DropDownList con datos de la base.
    lo que deseo es que al escribir en mi textbox un codigo mi DropDownList cambie el valor selecionado autimaticamente

    ResponderEliminar
  49. hola fausto

    no mencionas como cargos los items en el combo pero si defines el ValueMember, DisplayMemeber y Datasource podrias asignar el selectedValue con el valor del textbox y si algun valor coincide lo seleccionara

    combobox1.SelectedValue = TextBox1.Text;

    pero debe existir un valor coincidente con la asignacion del ValueMember

    saludos

    ResponderEliminar
  50. hola Leandro
    los datos del combo los cargo con datos de mi base de datos
    lo que voy a escribir en mi textbox es un codigo en pwsql("un campo en mi base") y mi DropDownList deseo que me aparesca el item que se relaciona con lo que dijite en el textbox
    mi codigo:




    ResponderEliminar
  51. asp:DropDownList ID="ddlSucursal" runat="server" Width="350px"
    AutoPostBack="True" DataSourceID="dsSucursal" DataTextField="sucursal"
    DataValueField="clave"

    ResponderEliminar
  52. asp:SqlDataSource ID="dsSucursal" runat="server"
    ConnectionString="<%$ ConnectionStrings:dataexpressConnectionString %>"
    SelectCommand="SELECT clave, ISNULL(pwsql,'') + ' - ' + sucursal + ' ' + CONVERT (varchar(5), codigo) + ' - ' + CONVERT (varchar(100), domicilio) AS sucursal FROM Sucursales order by sucursal"

    ResponderEliminar
  53. el cambio del DropDownList lo deseo hacer en el evento OnTextChanged="tb_cod_TextChanged" de mi texbox

    ResponderEliminar
  54. Buenos días! Los molesto con una consulta. Pude crear un combobox en PowerPoint que me muestra una serie de trámites. El problema es que cada vez que abro el archivo tengo que ejecutar el código ya que el desplegable aparece vacío. Según leí en varios lados, el combobox requiere un evento disparador que cargue los datos en él cada vez que se abra. ¿Podrían indicarme cómo hacerlo? Desde ya muchas gracias por vuestra atención.

    Saludos cordiales,

    Diego

    ResponderEliminar
  55. hola Diego

    como es eso de un combo en powerpoint? o sea en office
    pero eso se programa en VBA

    quizas podrias cargar los items en algun evento inicializacion del ppt

    Events supported by PowerPoint

    saludos

    ResponderEliminar
  56. hola leandro disculpa una prregunta lo que estoy intentando es poder elegir varias opciones de un dropdown y q estas opciones vayan mostrando su propio dropdown hijo con parametros que pertenecen a esa opcion me explico? similar al clasico paises estado, pero con la diferencia de elegir por ejemplo dos paises y en su respectivo dropdown sus estados espero me puedas ayudar me urge :(

    ResponderEliminar
  57. Hola Leandro necesito de tu valiosa ayuda, cómo hago luego de agregar un item a un dropdownlist que diga "TODOS", si el usuario selecciona esa opcion hacer una consulta a la base de datos por todos los item del mismo, ej: Tengo un combo con las opciones:
    1-Matemáticas
    2-Español
    3-Todos
    Si se selecciona matemàticas me muestra todos los estudiantes que reciben matemàticas y los muestro en un gridview, así sucesivamente con español; pero si se selecciona "TODOS"como hacer un select por cada uno de los item anteriores y mostrarlos. Agradezco de antemano tu valiosa ayuda.

    Espero tu respuesta

    ResponderEliminar
  58. hola Yeyner

    si selecciona todos no seleccionas por los otros item, sino que anulas el filtro asignando un DbNull.Value por parametro

    esto lo explico en este articulos

    Filtros Condicionales (1/2)

    saludos

    ResponderEliminar
  59. Hola Leandro, nesecito de tu ayuda, como puedo hacer para que en una caja de texto solo me acepte 2 espacio(tecla) , y cuando escriba algo como esto(""zzz","aaa","pppp") este validado para que no acepte estos tipos de texto.
    lo estoy desarrollando en Visual Studio 2013 C#
    de antemano muchas Gracias.

    ResponderEliminar
    Respuestas
    1. hola
      Podrias evaluar si puedes usar el control MaskedTextBox y aplicando una mascara ver si se puede limitar
      O poderias ver si usando el evento Validating, entonces cuando se quita el foco del control aplicar una regular expression que verifique si cumple con el input valido
      Regular Expression Language - Quick Reference
      saludos

      Eliminar
  60. Hola Leandro, tengo una duda, tengo varios droplist que funcionan con consultas a la base de datos y dependiendo de la selección se llena el segundo y el tercero, la carga funciona bien, pero tengo la opción de agregar otro ítem, también funciona, se carga todo en la base de datos, sin embargo me piden que al cargarse en la base de datos, dependiendo de lo que se haya agregado aparezca como selección en el drop, pero me marca un error porque el ítem seleccionado no se encuentra en la lista, esto sucede porque se carga en la base de datos pero no se recarga el drop, mi pregunta es, como puedo forzar la recarga del drop y seleccionar lo que se acaba de ingresar???

    ResponderEliminar
  61. Hola Leandro, ojala me pudieras orientar en esto, sucede que tengo en un panel 3 droplist anidados, el panel está oculto y se muestra hasta que se selecciona un elemento de un GridView , pero acurre un error, por el hecho de que está oculto el panel, el primer droplist (que desencadena el llenado de los otros dos) no se carga, si lo hago visible cuando muestro el gridview si funciona, pero necesito que el panel esté oculto y mostrarlo hasta el evento de seleccionar, el drop está cargado con datos de una base de datos desde asp con un sqldatasource. Ojalá me puedas ayudar. Gracias

    ResponderEliminar
    Respuestas
    1. hola
      Imagino que no funciona porque si ocultas un panel con codigo .net este no se renderiza en el cliente.
      Lo que podrias evaluar es si puedes ocultar el panel usando codigo javascript o por medio de style="diaply:none" de esta fotrma el panel y los combos se renderzan en el cliente pero estaran ocultos
      saludos

      Eliminar
  62. Hola Leandro mira tengo una pregunta. Tengo una practica y en mi Web Form tengo 2 Drop Down List cada uno tiene sus valores pero quisiera saber y que puedo hacer para cuando escoga dos valores u opciones que se me despliegan ahi iguales estos no se señalen como por ejemplo:
    Origen: Monterrey
    Destino: Monterrey
    ***Quiero saber como validar esto porfavor :D

    ResponderEliminar
    Respuestas
    1. hola
      Entiendo que es un desarrollo winform, por lo que podrias definir los eventos SelectionChangeCommitted de estos combos y en este evento validar la seleccion del otro combo, si es coincidente avisarias al usuario, o cambiarias la seleccion definien el SelectedIndex = -1 para que quede en blanco el combo
      saludos

      Eliminar
  63. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  64. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  65. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  66. Hola Leandro, tengo una pregunta espero no sea tan desprolija. Tengo un frmAgregarEmpleado donde tengo dos cmb: Provincias y ciudades. Traigo los elementos de dos listas enlazadas a base de datos. La lista de provincias anda bien, y pude agregar el con tu solución. Pero en el caso de las ciudades no me deja porque el método ListarCiudades no tiene ninguna sobre carga. Acá te paso como muestro ambas listas y podrás ver que la de ciudades es más sucia que la de provincias. Por ahí debe estar el error. No sé si será la forma en la que relaciono ciudades con provincias, o el hecho de que tenga un atributo byte cod_provincia que despues jode.. no entiendo mucho. Ojalá se entienda, gracias

    public List ListarProvincias()
    {
    using (var db = new DB_LaCortadaEntities())
    {
    return db.Provincias.OrderBy(c=>c.Nombre).ToList();
    }
    }


    public List ListarCiudades(byte cod_provincia)
    {
    using (var db = new DB_LaCortadaEntities())
    {
    return db.Ciudades.Where(x => x.Cod_Provincia == cod_provincia).OrderBy(c=>c.Nombre).ToList();
    }
    }

    ResponderEliminar
  67. Hola Leandro,
    Estoy trabajando con vb.net y tengo un form con un ABM de clientes donde tengo un DataGridView en el que se listan todos los clientes almacenados en la BD y también a un costado los textBox y ComboBox donde se muestran TODOS los datos del cliente que esta seleccionado en el DGV. Para esto, configure la propiedad DGVCliente.SelectionChanged que es la que se encarga de ello y funciona perfecto para los textBox, pero en el caso de los conboBox, no estoy logrando que me muestre el campo correcto. Si bien va cambiando el valor en el combobox a medida q se seleccionan distintos clientes, el problema es que no muestra el registro correspo0ndiente a la foránea de este

    Private Sub DGVCliente_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DGVCliente.SelectionChanged
    Try
    t_id.Text = DGVCliente.Rows(DGVCliente.CurrentRow.Index).Cells(0).Value 'id_cli
    t_nombre.Text = DGVCliente.Rows(DGVCliente.CurrentRow.Index).Cells(1).Value 'nombre_cli
    t_apellido.Text = DGVCliente.Rows(DGVCliente.CurrentRow.Index).Cells(2).Value 'apellido_cli
    If cb_iva.Items.Count > 0 Then
    cb_iva.SelectedIndex = DGVCliente.Rows(DGVCliente.CurrentRow.Index).Cells(3).Value 'fk_iva_cli
    End If

    ResponderEliminar