En C# .NET 2.0, tengo un ComboBox de WinForms con ComboBoxStyle DropDownList. Sin embargo, el menú desplegable aparece cada vez que el usuario hace clic en cualquier lugar del cuadro combinado. En cambio, me gustaría que solo se abra cuando el usuario hace clic explícitamente en el botón desplegable. Cuando el usuario hace clic en el resto del cuadro combinado, me gustaría asignarle el foco del teclado para que pueda usar algunos comandos del teclado en el elemento seleccionado. ¿Cuál es la mejor manera de hacer esto?¿Cómo puedo forzar que un ComboBox estilo DropDownList solo se abra cuando el usuario hace clic en el botón desplegable?
Respuesta
Después de un poco de ayuda de las otras respuestas, llegué a esta solución rápida:
public class MyComboBox : ComboBox
{
public MyComboBox()
{
FlatStyle = FlatStyle.Popup;
DropDownStyle = ComboBoxStyle.DropDownList;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0201 /* WM_LBUTTONDOWN */ || m.Msg == 0x0203 /* WM_LBUTTONDBLCLK */)
{
int x = m.LParam.ToInt32() & 0xFFFF;
if (x >= Width - SystemInformation.VerticalScrollBarWidth)
base.WndProc(ref m);
else
{
Focus();
Invalidate();
}
}
else
base.WndProc(ref m);
}
}
Puede obtener la posición X, Y del clic del mouse, y desde allí puede forzarlo a colapsar si no está en el "icono" desplegable (a falta de una palabra mejor).
Tiene dos problemas a tener en cuenta. El primero es bastante simple: determinar si el menú desplegable debe abrirse o cerrarse. Este código puede hacer eso:
void comboBox1_MouseClick(object sender, MouseEventArgs e)
{
ComboBox combo = sender as ComboBox;
int left = combo.Width - (SystemInformation.HorizontalScrollBarThumbWidth + SystemInformation.HorizontalResizeBorderThickness);
if (e.X >= left)
{
// They did click the button, so let it happen.
}
else
{
// They didn't click the button, so prevent the dropdown.
}
}
El segundo problema es más significativo: en realidad impide que aparezca el menú desplegable. El enfoque más simple es:
comboBox1.DropDownStyle = ComboBoxStyle.DropDown;
Pero, que permite escribir en la caja, que puede que no desee.
Pasé unos 15 minutos mirando las opciones, y parece que para evitar que aparezca el menú desplegable y al mismo tiempo evitar que el usuario escriba en el menú desplegable, necesitaría subclasificar el control. De esta forma, puede anular OnMouseClick() y solo llamar a base.OnMouseClick() cuando hicieron clic en el botón. Se vería algo como esto (no probado):
public class CustomComboBox : ComboBox
{
protected override void OnMouseClick(MouseEventArgs e)
{
base.OnMouseClick(e);
int left = this.Width - (SystemInformation.HorizontalScrollBarThumbWidth + SystemInformation.HorizontalResizeBorderThickness);
if (e.X >= left)
{
// They did click the button, so let it happen.
base.OnMouseClick(e);
}
else
{
// They didn't click the button, so prevent the dropdown.
// Just do nothing.
}
}
}
- 1. Cómo forzar LostFocus cuando se hace clic en el botón
- 2. ¿Forzar el ComboBox para que se abra en Silverlight?
- 3. C# ComboBox en estilo DropDownList, ¿cómo configuro el texto?
- 4. WPF: ComboBox sin el botón desplegable
- 5. ¿Por qué SelectedIndexChanged se dispara para una DropDownList cuando se hace clic en un botón?
- 6. ¿Cómo puedo hacer que una aplicación se abra cuando un usuario hace doble clic en su archivo asociado?
- 7. Haciendo que los navegadores ignoren el hash URL cuando se hace clic en el botón Atrás
- 8. Cómo cambiar el estilo de ComboBox de celda en DataGridViewComboBoxColumn
- 9. Pidiendo confirmación cuando se hace clic en el botón "X"
- 10. ¿Cómo redirecciono a un usuario cuando se hace clic en un botón?
- 11. JQuery UI Autocompletar: haga que el menú se abra cuando el usuario haga clic en el cuadro de texto
- 12. aplicación Java swing, cierre una ventana y abra otra cuando se haga clic en el botón
- 13. java: Abra la carpeta en el botón clic
- 14. ¿Cómo se reproduce el sonido cuando se hace clic en el botón en Android?
- 15. cómo mostrar opciones cuando un usuario hace clic en UITableViewCellAccessoryDetailDisclosureButton
- 16. ¿Cómo depurar CSS con Firebug para un elemento que solo aparece cuando se hace clic?
- 17. pyqt4: Abra el sitio web en el navegador estándar en el botón haga clic en
- 18. jQuery - Incremente el valor de un contador cuando se hace clic en un botón
- 19. Botón de envío de rieles: ¿Cómo hago para que el botón ejecute un cierto método cuando se hace clic?
- 20. El botón de clic no se activa después de un campo de entrada de intercambio cuando el usuario hace clic inmediatamente en el botón
- 21. cambiar el contenido del div cuando se hace clic en el enlace/botón
- 22. botón personalizado: cambiar el estilo cuando se pulsa el botón
- 23. ¿La aplicación se minimiza en la bandeja del sistema cuando se hace clic en el botón?
- 24. Cómo evitar que se abra el menú de selección
- 25. Evitar que ShowDialog() vuelva cuando se hace clic en el botón Aceptar
- 26. Haga algo cuando se hace clic en el botón Cerrar en un JFrame
- 27. ¿Cómo abrir Windows Explorer cuando hago clic en un botón?
- 28. JSTree: ¿Hacer que el nodo se expanda cuando se hace clic solo en lugar de hacer doble clic?
- 29. stop mouseleave cuando se hace clic en un objeto
- 30. manera más eficiente de reproducir un sonido cuando se hace clic en el botón
El ancho de barra de desplazamiento era útil, pero utilizando los eventos WinForms ratón/funciones no es útil. Se llaman demasiado tarde. – Eric
Los eventos y funciones de WinForms se invocan al mismo tiempo que los mensajes normales de Windows. Es el manejo de ellos lo que importa. Encontrar una forma de evitar el comportamiento predeterminado es el desafío, ya que el tiempo es el mismo. –
Estaba escribiendo metafóricamente. Internamente, parece que antes de que se llame a los eventos de mouse de WinForms, aparece el menú desplegable Y se envía el evento desplegable. Por lo tanto, usar los eventos de WinForms no es suficiente para evitar que aparezca el menú desplegable. – Eric