2009-04-24 14 views
13

Ho un piccolo problema che mi ha infastidito per alcune ore.La parte EditBox di ComboBox viene selezionata automaticamente

Nella mia applicazione WinForms (.NET 3.5) creo alcuni ComboBox (DropDownStyle = DropDown) in un TableLayoutPanel in fase di esecuzione e lo compilo con le stringhe. I ComboBox sono configurati per il ridimensionamento automatico (Ancora = Sinistra | Destra).

Il problema è che ogni volta che i ComboBox vengono ridimensionati (cioè la finestra di dialogo viene ridimensionata), la parte editbox del ComboBox viene selezionata/evidenziata interamente. Secondo me ciò crea un effetto molto confuso per il cliente che voglio evitare.

Il problema non si verifica se il ComboBox ha una dimensione fissa.

Si noti inoltre che la modifica di DropDownStyle non è un'opzione: è necessario inserire manualmente il testo.

Ho già provato a risolvere il problema con l'override del metodo OnPaint, che non ha funzionato. Ho anche provato a cancellare la selezione nell'evento ComboBox.Resize, che ha funzionato in un certo modo, ma mi è sembrata una soluzione molto brutta - c'era un sacco di sfarfallio, il testo intenzionalmente selezionato è stato deselezionato e dovrei aggiungere il gestore di eventi a ogni singolo ComboBox nella mia finestra di dialogo.

C'è una soluzione migliore a questo problema?

Grazie in anticipo.

saluti, Andy

+0

La porzione di testo non è modificabile quando si utilizza DropDownList. Intendevi DropDown? –

risposta

13

Questa è una vecchia questione, ma ho trovato la ricerca di una risposta e ha finito per attuare la mia soluzione. Potrebbe anche pubblicarlo qui, giusto?

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

testo intenzionalmente selezionato divenne deselezionato

Questa WinForms bug non influisce ComboBoxes selezionati, così ignorando quelli con Focus, ci prendiamo cura del problema di perdere selezioni correnti.

avrei dovuto aggiungere il gestore di eventi ad ogni ComboBox sulla mia finestra .

Preso cura con il ciclo foreach. Mettilo in InitializeComponent() o nel tuo .ctor se non vuoi rompere il designer o farlo rompere con il designer.

c'era un sacco di sfarfallio

sto solo vedendo sfarfallio se a ridimensionare molto veloce, ma io sono su Win7 quindi potrebbe risultare diversa da XP.

+0

Volevo suggerire di fare un this.SelectNextControl o una combobox.SelectNextControl –

+0

Grazie per questo. Mi ha infastidito per un po 'e solo ora ho avuto il tempo di sistemarlo. Ogni controllo di tipo combo-box nella mia app eredita da un oggetto di base (quindi posso avere un'etichetta, metodi comuni, ecc.). L'inserimento di un gestore di eventi OnResize per la casella combinata ha risolto il problema, anziché doverlo ripetere. Grazie! –

2

Wow. Grazie ragazzi!

Apparentemente questo errore è persistito per molti anni. Sto costruendo un UserControl con .Net 4 (Visual Studio 2010). Ecco la mia versione leggermente modificata del codice di bsneeze.

Acclamazioni

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

Mi piace molto questa notazione foreach (var cb in Controls.OfType ()) – CodingBarfield

0

ho trovato impostare la lunghezza della selezione a 0 per il combo-box sul caso di ridimensionamento di qualsiasi controllo della casella combinata è sulle cause di un molto meno sfarfallio invece di farlo su il ridimensionamento della combo stessa.

Realmente ho ottenuto questo in VB.Net ma dovrebbe applicarsi lo stesso a C#.

1

Nessuna delle risposte finora ha funzionato per me. L'unico metodo affidabile che ho trovato è stato di inviare un messaggio in modo asincrono tramite BeginInvoke che riporta SelectionLength a zero dopo che tutte le altre attività sul controllo sono state completate. La quantità di sfarfallio è molto fastidiosa e poco professionale, ma è il meglio che ho potuto inventare ... finora.

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

Mi chiedo se le altre risposte qui non hanno funzionato perché il tuo 'ComboBox' era in un' TableLayoutPanel'? –

+0

@JeffRoe: Non ricordo i dettagli. Era troppo tempo fa, ma sì, è molto possibile. –

0

Gestire l'evento di ridimensionamento per il contenitore padre di ComboBox. Mettere questa linea in là:

MyComboBox.SelectionLength = 0

un esempio (VB, ovviamente):

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

    MyComboBox.SelectionLength = 0 

End Sub 

buona fortuna a voi!

--BP

0

Questo sembra essere un bug nell'implementazione nativo di Windows di ComboBox con DropDownStyle di DropDown.

La correzione dettagliato nelle altre risposte qui (impostando la proprietà SelectionLength a 0 (zero) in Resize evento s' il ComboBox) funziona bene la maggior parte del tempo.

Tuttavia, ho trovato che anche quella correzione per aggirare questo bug non sempre funziona. Se lo ComboBox è in un TableLayoutPanel e se lo TableLayoutPanel ha più di una colonna con un tipo di dimensione Percent, la correzione spesso non funziona.

Un'immagine vale più di mille parole. Guarda la seguente schermata di un modulo che ho creato per dimostrare il problema.

enter image description here

Problemi correlati