Tengo una aplicación WinForms y me preguntaba si había una manera más elegante de deshabilitar el elemento Combobox sin cambiar la propiedad SelectedIndex -1 para todos los valores deshabilitados.Desactivar elementos particulares en un cuadro combinado
He estado buscando en Google y muchas de las soluciones involucran a ASP.Net DropDownLists pero este LINK parece prometedor. Creo que tendré que construir mi propio control ComboBox, pero antes de reinventar la rueda me imagino que preguntaría si es posible.
ACTUALIZACIÓN
Aquí está la solución final, gracias a Arif Eqbal:
//Add a Combobox to a form and name it comboBox1
//
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.comboBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem);
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
}
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.Items.Add("Test1");
this.comboBox1.Items.Add("Test2");
this.comboBox1.Items.Add("Test3");
this.comboBox1.Items.Add("Test4");
this.comboBox1.Items.Add("Test5");
this.comboBox1.Items.Add("Test6");
this.comboBox1.Items.Add("Test7");
}
Font myFont = new Font("Aerial", 10, FontStyle.Underline|FontStyle.Regular);
Font myFont2 = new Font("Aerial", 10, FontStyle.Italic|FontStyle.Strikeout);
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == 1 || e.Index == 4 || e.Index == 5)//We are disabling item based on Index, you can have your logic here
{
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), myFont2, Brushes.LightSlateGray, e.Bounds);
}
else
{
e.DrawBackground();
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), myFont, Brushes.Black, e.Bounds);
e.DrawFocusRectangle();
}
}
void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex == 1 || comboBox1.SelectedIndex == 4 || comboBox1.SelectedIndex == 5)
comboBox1.SelectedIndex = -1;
}
}
}
ASP.NET = WinForms, no se ven allí. Extender el ComboBox básico no es muy difícil (generalmente se hace para agregar casillas de verificación o íconos o lo que sea), pero no creo que haya tal soporte estándar. –
El enlace que ha mencionado es el camino a seguir si realmente desea dar a los usuarios una idea del elemento que se está deshabilitando. Es posible que desee dibujar el texto en gris, es posible que no desee mostrar un color de fondo de selección, y así sucesivamente y, por supuesto, el usuario aún puede seleccionar ese elemento, por lo que necesitará manejar selectedIndexChanged y establecer el selectedIndex en -1. Pero será visualmente más sugerente hacer el ejercicio. –