En realidad, hay algunas soluciones razonables para esta pregunta. Un foro de MSDN tiene una publicación ComboBox Item highlight event que contiene dos posibilidades, una de nobugz y una de agrobler. Cada uno de ellos proporciona código para subclase de un ComboBox que se supone que maneja sugerencias de herramientas sobre elementos individuales en el menú desplegable de ComboBox. La solución de Agrobler parece más pulida, ya que incluso incluye algunas buenas ilustraciones, pero desafortunadamente no está claro (al menos para mí) cómo llenar la propiedad crucial ToolTipMember del control.
Ambas soluciones parecen permitir información de herramientas arbitraria asignada a elementos individuales. Un caso más específico, pero más común, es donde simplemente desea que la información sobre herramientas refleje el texto del elemento, cuando sabe que puede tener elementos demasiado largos para ajustarse al ancho del ComboBox. En mi caso, tengo una instancia de un ComboBox que contiene rutas completas de archivos, por lo que es fácil ver dónde el contenido podría exceder el ancho del ComboBox.
Zhi-Xin Ye, en la publicación del foro MSDN Windows Dropdown question, proporciona una solución que resuelve este problema más específico y es mucho más simple. Reproduzco el código aquí en su totalidad. (Tenga en cuenta que este código presupone que haya creado un formulario llamado Form1 y conectado la carga manejador se muestra, y también se agrega un cuadro combinado llamado comboBox1 y un controlador de punta de la herramienta toolTip1.)
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
}
void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
string text = this.comboBox1.GetItemText(comboBox1.Items[e.Index]);
e.DrawBackground();
using (SolidBrush br = new SolidBrush(e.ForeColor))
{ e.Graphics.DrawString(text, e.Font, br, e.Bounds); }
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{ this.toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
else { this.toolTip1.Hide(comboBox1); }
e.DrawFocusRectangle();
}
Mientras que es simple y concisa, este código sufre de un defecto (como se señala en una respuesta del subproceso MSDN anterior): al mover el mouse (sin hacer clic) de un elemento desplegable al siguiente, solo cada otro muestra una información sobre herramientas persistente. La corrección sólo se insinúa por todavía otra entrada en ese hilo, por lo que pensó que sería útil proporcionar la plena, código corregido aquí:
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
comboBox1.DrawItem += comboBox1_DrawItem;
comboBox1.DropDownClosed += comboBox1_DropDownClosed;
}
private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
toolTip1.Hide(comboBox1);
}
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0) { return; } // added this line thanks to Andrew's comment
string text = comboBox1.GetItemText(comboBox1.Items[e.Index]);
e.DrawBackground();
using (SolidBrush br = new SolidBrush(e.ForeColor))
{ e.Graphics.DrawString(text, e.Font, br, e.Bounds); }
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{ toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
e.DrawFocusRectangle();
}
Además de eliminar unas pocas porciones redundantes de código (por ejemplo, el "este "calificador") la diferencia principal es mover la llamada toolTip1.Hide al controlador de eventos DropDownClosed. Sacarlo del controlador DrawItem elimina el defecto mencionado anteriormente; pero luego debe cerrarlo cuando se cierre el menú desplegable; de lo contrario, la última información sobre herramientas que se muestra permanecerá en pantalla.
2012.07.31 Adición
Sólo quería mencionar que desde entonces he creado un cuadro combinado compuesto que incorpora esta capacidad sobre herramientas así que si usa mi biblioteca no tienes código para escribir en absoluto. Simplemente arrastre un ComboBoxWithTooltip al diseñador de Visual Studio y listo. Desplácese hasta ComboBoxWithTooltip en mi API page o download mi biblioteca de código abierto C# para comenzar. (Tenga en cuenta que el parche para el error que atrapó Andrew estará en la versión 1.1.04, que saldrá pronto.)
Cómo hacer que hacer un combo de dos columnas? –
Hay algunos gratuitos alrededor. Encontré este en codeproject pero no lo he usado y no puedo comentar lo bueno que es: http://www.codeproject.com/KB/cpp/multicolumncombo.aspx –
No creo que esto sea inusual en absoluto. La situación común es si el texto del elemento es demasiado largo y no puede ver la cola de la cadena. Una sugerencia de herramienta es una forma muy obvia de mostrar el artículo. Un combo de dos columnas parece torpe y horrible. – Andrew