2009-04-24 4 views
13

Ich habe ein kleines Problem, das mich für einige Stunden nervte.Editbox Teil von ComboBox wird automatisch ausgewählt

In meiner WinForms (.NET 3.5) Anwendung erstelle ich einige ComboBoxen (DropDownStyle = DropDown) zur Laufzeit in einem TableLayoutPanel und fülle es mit Strings. Die ComboBoxen sind so konfiguriert, dass die Größe automatisch geändert wird (Anker = Links | Rechts).

Das Problem ist, dass, wenn die Größe der ComboBoxen geändert wird (d. H. Die Größe des Dialogfelds geändert wird), der Bearbeitungsbereich der ComboBox vollständig ausgewählt/hervorgehoben wird. Meiner Meinung nach erzeugt dies einen sehr verwirrenden Effekt für den Kunden, den ich vermeiden möchte.

Das Problem tritt nicht auf, wenn die ComboBox eine feste Größe hat.

Beachten Sie auch, dass das Ändern des DropDownStyle keine Option ist - ich brauche die Möglichkeit, Text manuell einzugeben.

Ich habe schon versucht, mit der OnPaint-Methode zu umgehen, die nicht ganz funktionierte. Ich habe auch versucht, die Auswahl im ComboBox.Resize -Ereignis zu löschen, die auf eine Art funktionierte, aber schien wie eine sehr hässliche Lösung - es gab eine Menge Flimmern, absichtlich ausgewählten Text wurde abgewählt und ich würde den Event-Handler hinzufügen müssen jede ComboBox in meinem Dialog.

Gibt es eine bessere Lösung für dieses Problem?

Vielen Dank im Voraus.

Grüße, Andy

+0

Der Textteil kann nicht bearbeitet werden, wenn Sie verwenden Dropdownlist. Meintest du DropDown? –

Antwort

13

Dies ist eine alte Frage, aber ich fand es Suche nach einer Antwort und meine eigene Lösung Umsetzung endete. Könnte es auch hier posten, oder?

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

absichtlich ausgewählten Text wurde

Dieser WinForms Fehler wirkt sich nicht auf ausgewählte Comboboxen abgewählt, so durch die, die mit Fokus ignorieren, wir kümmern uns um das Problem aktuelle Auswahl zu verlieren.

ich hätte den Event-Handler zu jeder ComboBox auf meinem Dialog hinzuzufügen.

Aufgepasst durch die foreach-Schleife. Setzen Sie es in InitializeComponent() oder Ihre .ctor, wenn Sie nicht möchten, den Designer zu brechen, oder der Designer das brechen.

es gab eine Menge von Flimmern

ich nur sehen, Flimmern, wenn ich sehr schnell die Größe, aber ich bin auf Win7 so könnte es auf XP unterschiedlich sein.

+0

Ich wollte vorschlagen, dies zu tun.SelectNextControl oder eine Combobox.SelectNextControl –

+0

Vielen Dank dafür. Es nervt mich seit einiger Zeit und hat es gerade erst repariert. Jedes Steuerelement des Typs "Kombinierte Box" in meiner App erbt von einem Basisobjekt (also kann ich eine Beschriftung, allgemeine Methoden usw. haben). Durch das Einfügen eines OnResize-Ereignishandlers für das Kombinationsfeld wurde mein Problem behoben, anstatt iterieren zu müssen. Vielen Dank! –

2

Wow. Danke Jungs!

Offenbar hat dieser Fehler viele Jahre bestanden. Ich baue ein UserControl mit. Net 4 (Visual Studio 2010). Hier ist meine leicht veränderte Version von bsneeze's Code.

Prost

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

Ich mag diese Notation viel besser foreach (var cb in Controls.OfType ()) – CodingBarfield

0

ich für die Combo-Box auf dem Resize-Ereignisse von was auch immer auf 0 gefunden steuert die Combo-Box auf Ursachen ist eine viele weniger Flackern Einstellung der Auswahl Länge, anstatt sie auf zu tun die Größe der Combo selbst ändern.

Ich habe dies tatsächlich in VB.Net erreicht, aber es sollte das gleiche für C# gelten.

1

Keine der Antworten funktionierte bisher für mich. Die einzige zuverlässige Methode, die ich gefunden habe, war, eine Nachricht asynchron über BeginInvoke zu posten, die SelectionLength wieder auf Null setzt, nachdem alle anderen Aktivitäten auf dem Steuerelement abgeschlossen sind. Die Menge an Flimmern ist sehr nervig und unprofessionell, aber es ist das Beste, was ich mir vorstellen kann ... bisher.

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

Ich frage mich, ob die anderen Antworten hier nicht für Sie arbeiten, weil Ihre 'ComboBox' in einem' TableLayoutPanel' war? –

+0

@ JeffRoe: Ich erinnere mich nicht an die Details. Es war zu lange her, aber ja, das ist sehr gut möglich. –

0

Behandeln Sie das Resize-Ereignis für den übergeordneten Container der ComboBox. Setzen Sie diese Zeile in dort:

MyComboBox.SelectionLength = 0

Ein Beispiel (VB, natürlich):

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

    MyComboBox.SelectionLength = 0 

End Sub 

Viel Glück für Sie!

--BP

0

Dies scheint ein Fehler in der nativen Windows-Implementierung von ComboBox mit DropDownStyle von DropDown zu sein.

Die in den anderen Antworten detailliert fix hier (die SelectionLength Eigenschaft auf 0 (Null) in der ComboBox ‚s Resize Ereignis Einstellung) funktioniert gut die meiste Zeit.

Allerdings habe ich festgestellt, dass auch diese Korrektur um diesen Fehler nicht immer funktioniert. Wenn sich ComboBox in einem TableLayoutPanel befindet und wenn TableLayoutPanel mehr als eine Spalte mit einem Percent Size Type hat, funktioniert dieser Fix oft nicht.

Ein Bild sagt mehr als tausend Worte. Sehen Sie sich den folgenden Screenshot eines Formulars an, das ich gemacht habe, um das Problem zu demonstrieren.

enter image description here

Verwandte Themen