2009-04-24 6 views
13

Tengo un pequeño problema que me ha molestado durante algunas horas.La parte de la caja de edición de ComboBox se selecciona automáticamente

En mi aplicación WinForms (.NET 3.5) creo algunos ComboBoxes (DropDownStyle = DropDown) en TableLayoutPanel en el tiempo de ejecución y lo lleno con cadenas. Los ComboBoxes están configurados para cambiar el tamaño automáticamente (Ancla = Izquierda | Derecha).

El problema es que cada vez que se cambian los tamaños de los cuadros combinados (es decir, se redimensiona el cuadro de diálogo), la porción de cuadro de edición del cuadro combinado se selecciona/resalta por completo. En mi opinión, esto crea un efecto muy confuso para el cliente que quiero evitar.

El problema no aparece si el ComboBox tiene un tamaño fijo.

También tenga en cuenta que cambiar DropDownStyle no es una opción: necesito la posibilidad de ingresar texto manualmente.

Ya he intentado jugar con la anulación del método OnPaint, que no funcionó del todo. También intenté borrar la selección en el evento ComboBox.Resize, que funcionó de alguna manera, pero me pareció una solución muy fea: hubo mucho parpadeo, el texto seleccionado intencionalmente se deseleccionó y tuve que agregar el controlador de eventos a todos y cada uno de los ComboBox en mi cuadro de diálogo.

¿Existe una mejor solución a este problema?

Gracias de antemano.

Saludos, Andy

+0

La porción de texto no se puede editar cuando se utiliza DropDownList. ¿Quisiste decir DropDown? –

Respuesta

13

Esta es una vieja pregunta, pero he encontrado que la búsqueda de una respuesta y terminaron la implementación de mi propia solución. Bien podría publicarlo aquí, ¿verdad?

foreach (var cb in Controls.OfType<ComboBox>()) 
    { 
     cb.Resize += (sender, e) => { 
      if (!cb.Focused) 
       cb.SelectionLength = 0; 
     }; 
    } 

texto seleccionado intencionalmente quedó seleccionada

Este error de Windows Forms no afecta ComboBoxes seleccionados, por lo que haciendo caso omiso de los que tienen Focus, nos ocupamos del problema de perder las selecciones actuales.

tendría que añadir el controlador de eventos a todos y cada ComboBox en mi diálogo .

Cuidado del by foreach. Ponlo en InitializeComponent() o tu .ctor si no quieres romper el diseñador, o haz que el diseñador lo rompa.

había una gran cantidad de parpadeo

sólo estoy viendo si puedo cambiar el tamaño de parpadeo muy rápido, pero estoy en Win7 por lo que podría ser diferente en XP.

+0

Quería sugerir hacer esto. SeleccioneNextControl o un combobox.SelectNextControl –

+0

Gracias por esto. Me ha estado molestando por un tiempo y recién ahora me he dado la vuelta para arreglarlo. Cada control de tipo combo-box en mi aplicación hereda de un objeto base (para que pueda tener una etiqueta, métodos comunes, etc.). Poner en un controlador de eventos OnResize para el cuadro combinado ha abordado mi problema, en lugar de tener que iterar. ¡Gracias! –

2

Wow. ¡Gracias chicos!

Aparentemente, este error persistió durante muchos años. Estoy construyendo un UserControl con .Net 4 (Visual Studio 2010). Aquí está mi versión levemente modificada del código de bnsneeze.

Saludos

using System.Windows.Forms; 
using System.Linq; 

public MyUserControlCtor() 
{ 
    InitializeComponent(); 

    foreach(Control ctrl in Controls) 
    { 
     ComboBox cb = ctrl as ComboBox; 
     if (cb != null) 
     { 
      cb.Resize += (sender, e) => 
      { 
       if (!cb.Focused) 
        this.FCHZ_ComboBox.SelectionLength = 0; 
      }; 
     } 
    } 
} 
+0

Me gusta más esta notación foreach (var cb en Controls.OfType ()) – CodingBarfield

0

he encontrado ajuste de la longitud de la selección a 0 para el cuadro combinado en el caso de cambio de tamaño de cualquier controlan el combo-box es sobre las causas de un mucho menos parpadeo en lugar de hacerlo en el cambio de tamaño del combo en sí.

Lo logré en realidad en VB.Net pero debería aplicar lo mismo a C#.

1

Ninguna de las respuestas hasta ahora funcionó para mí. El único método confiable que he encontrado es publicar un mensaje de forma asincrónica a través de BeginInvoke que establece SelectionLength de nuevo en cero después de que se haya completado toda la demás actividad en el control. La cantidad de parpadeo es muy molesta y poco profesional, pero es lo mejor que se me ocurre ... hasta ahora.

internal class FixedComboBox : ComboBox 
{ 
    protected override void OnResize(EventArgs e) 
    { 
     if (IsHandleCreated && !Focused) 
     { 
      BeginInvoke((Action)(() => 
       { 
        SelectionLength = 0; 
       })); 
     } 
     base.OnResize(e); 
    } 
} 
+0

Me pregunto si las otras respuestas aquí no funcionaron para usted porque su 'ComboBox' estaba en' TableLayoutPanel'? –

+0

@JeffRoe: No recuerdo los detalles. Fue hace mucho tiempo, pero sí, eso es muy posible. –

0

Gestione el evento Resize para el contenedor principal de ComboBox. Ponga esta línea allí:

MyComboBox.SelectionLength = 0

un ejemplo (VB, obviamente):

Private Sub MyControl_Resize(sender As Object, e As EventArgs) Handles Me.Resize 

    MyComboBox.SelectionLength = 0 

End Sub 

buena suerte a usted!

--BP

0

Esto parece ser un error en la implementación nativa de Windows de ComboBox con DropDownStyle de DropDown.

La solución se detalla en las otras respuestas aquí (estableciendo la propiedad SelectionLength a 0 (cero) en caso de que el ResizeComboBox 's) funciona bien la mayor parte del tiempo.

Sin embargo, descubrí que incluso esa solución para evitar este error no siempre funciona. Si el ComboBox está en un TableLayoutPanel, y si ese TableLayoutPanel tiene más de una columna con un tipo de tamaño Percent, entonces esa corrección a menudo no funciona.

Una imagen vale más que mil palabras. Vea la siguiente captura de pantalla de un formulario que hice para demostrar el problema.

enter image description here

Cuestiones relacionadas