none
Deshabilitar Items ComboBox RRS feed

  • Pregunta

  • Hola grupo.

    Quiero deshabilitar un item de un combo que contiene cuatro elementos estáticos, aunque provienen de una tabla de BD. 

    El tema es, que quiero que cuando yo elija un item x de un combo primario, entonces uno o dos según esta selección, se desactiven en el combo secundario. Pero sin dejar de verse, sino con la atenuación acostumbrada.

    Gracias.

    domingo, 10 de julio de 2016 14:52

Todas las respuestas

  • Formulaz5,

    La clase ComboBox no expone propiedad para deshabilitar un ítem de la colección de elementos que contiene un objeto de tipo ComboBox. Pero, una forma de crear el efecto es echando mano al método DrawString() para redibujar el texto de cada elemento de la colección -que se quiera "deshabilitar"- pintándolo de un color atenuado. De hecho, el método DrawString() sólo proporciona la apariencia más no la acción de dejar sin efecto la selección de un elemento "deshabiltado", para conseguirlo podemos usar el evento SelectedIndexChanged().

    Vamos a realizar un simple ejercicio: las vocales se clasifican en vocales fuertes (a, e, o) y débiles (i, u). Tendremos el objeto cboTipoVocales para cargar los tipos de vocales (vocales fuertes, vocales débiles) y el objeto cboVocales para cargar todas las vocales (a, e, i , o , u). El objetivo del ejercicio es conseguir que cuando el usuario seleccione el ítem "Vocales fuertes" queden "deshabilitadas" las vocales i, u, por el contrario, cuando el usuario seleccione el ítem "Vocales débiles" queden "deshabilitadas" las vocales a, e, o.

    Como no mencionas el lenguaje de programación que utilizas te dejaré el código en c#, puedes convertir las instrucciones a Visual Basic con Telerik Converter

    List<int> listaIndiceSegunTipoVocal = new List<int>();
    
    private void btnCargarElementos_Click(object sender, EventArgs e)
            {            
                cboTipoVocales.Items.AddRange(new string[] { "Vocales fuertes", "Vocales débiles" });
                cboVocales.Items.AddRange(new string[] { "A", "E", "I", "O", "U" });
            }

    Nota que tras presionar el botón [btnCargarElementos] se cargan los objetos cboTipoVocales y cboVocales con los elementos correspondientes. Nota también que declaro la variable listaIndiceSegunTipoVocal a nivel de clase que servirá de contenedor de las vocales según el tipo de vocal (fuertes o débiles). El siguiente bloque de código muestra como establecer las vocales según el tipo y además obliga al objeto cboVocales a redibujarse por cada vez que el usuario selecciona un nuevo elemento.

    private void cboTipoVocales_SelectionChangeCommitted(object sender, EventArgs e)
            {
                listaIndiceSegunTipoVocal.Clear();
    
                if (cboTipoVocales.Text == "Vocales fuertes")
                    listaIndiceSegunTipoVocal.AddRange(new int[] { 0, 1, 3 });
                else
                    listaIndiceSegunTipoVocal.AddRange(new int[] { 2, 4 });
    
                cboVocales.Refresh();
            }

    El bloque de código siguiente es el que se encarga de pintar los elementos en atenuado:

    private void cboVocales_DrawItem(object sender, DrawItemEventArgs e)
            {            
                if (e.Index != -1)
                {
                    e.DrawBackground();
    
                    e.Graphics.DrawString(((ComboBox)sender).Items[e.Index].ToString(), 
                        ((ComboBox)sender).Font,
                        (listaIndiceSegunTipoVocal.Contains(e.Index)) ? Brushes.Black : Brushes.LightGray,
                        e.Bounds);
                }
            }


    Finalmente, la acción de omitir la acción de un elemento seleccionado "deshabilitado" lo puedes conseguir con el método SelectedIndexChanged.

    private void cboVocales_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (!listaIndiceSegunTipoVocal.Contains(cboVocales.SelectedIndex))
                {
                    cboVocales.SelectedIndex = -1;
                    txtVocalSeleccionada.Text = string.Empty;                
                }
                else
                {
                    txtVocalSeleccionada.Text = cboVocales.Text;                
                }
            }

    Es todo, lo único que debes de tener sobre el formulario es un botón, dos desplegabables y una caja de texto. Algo importante: debes establecer la propiedad DrawModeOwnerDrawFixed del objeto cboVocales.


    Espero que la información proporcionada te haya sido de utilidad.


    domingo, 10 de julio de 2016 21:04
  • Le di un vistazo rápido y se ve incuestionable, si sale algo mal, de seguro soy el causante, jjjjjj

    Lo probare y te cuento después.

    Te di el voto.

    Muchas gracias Williams.

    lunes, 11 de julio de 2016 2:27