2009-04-24 6 views
13

J'ai un petit problème qui m'agace depuis quelques heures.La zone Editbox de ComboBox est sélectionnée automatiquement

Dans mon application WinForms (.NET 3.5), je crée des ComboBox (DropDownStyle = DropDown) dans un TableLayoutPanel à l'exécution et le remplis de chaînes. Les ComboBox sont configurés pour redimensionner automatiquement (Anchor = Left | Right). Le problème est que chaque fois que les zones de liste déroulante sont redimensionnées (c'est-à-dire que la boîte de dialogue est redimensionnée), la zone d'édition de la zone de liste déroulante est sélectionnée/mise en surbrillance entièrement. À mon avis, cela crée un effet très confus pour le client que je veux éviter.

Le problème n'apparaît pas si le composant ComboBox a une taille fixe.

Notez également que la modification de DropDownStyle n'est pas une option - j'ai besoin de la possibilité de saisir du texte manuellement.

J'ai déjà essayé de déranger en surchargeant la méthode OnPaint, qui n'a pas vraiment fonctionné. J'ai également essayé d'effacer la sélection dans l'événement ComboBox.Resize, qui fonctionnait d'une certaine façon, mais semblait être une solution très laide - il y avait beaucoup de scintillement, le texte sélectionné intentionnellement était désélectionné et je devais ajouter le gestionnaire d'événements chaque ComboBox sur mon dialogue.

Y a-t-il une meilleure solution à ce problème?

Merci à l'avance.

Cordialement, Andy

+0

La partie de texte est non modifiable lorsque vous utilisez DropDownList. Voulez-vous dire DropDown? –

Répondre

13

C'est une vieille question, mais je l'ai trouvé la recherche d'une réponse et a fini par mettre en œuvre ma propre solution. Pourrait aussi bien le poster ici, non?

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

texte volontairement choisi est devenu décochée

Ce bogue WinForms n'affecte pas ComboBoxes sélectionnés, donc en ignorant ceux avec Focus, nous nous occupons du problème de perdre les sélections actuelles.

Je dois ajouter le gestionnaire d'événements à chaque ComboBox sur ma boîte de dialogue .

Prise en charge par la boucle foreach. Mettez-le dans InitializeComponent() ou votre .ctor si vous ne voulez pas casser le concepteur, ou demandez au concepteur de le casser.

il y avait beaucoup de scintillement

Je ne vois que le scintillement si je remets à la côte très rapide, mais je suis sur Win7 il pourrait être différent sur XP.

+0

Je voulais suggérer de faire un this.SelectNextControl ou un combobox.SelectNextControl –

+0

Merci pour cela. Ça m'a dérangé pendant un certain temps et je viens tout juste de le régler. Chaque contrôle de type combo-box dans mon application hérite d'un objet de base (donc je peux avoir un label, des méthodes communes, etc.). Mettre dans un gestionnaire d'événement OnResize pour la zone de liste déroulante a résolu mon problème, plutôt que d'avoir à itérer. Merci! –

2

Wow. Merci les gars!

Apparemment, ce bug a persisté de nombreuses années. Je construis un UserControl avec .Net 4 (Visual Studio 2010). Voici ma toute petite version modifiée du code de bsneeze.

Vive

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

J'aime beaucoup mieux cette notation foreach (var cb dans Controls.OfType ()) – CodingBarfield

0

je trouve le réglage de la longueur de la sélection à 0 pour la zone de liste déroulante sur l'événement resize de tout contrôle de la zone de liste déroulante est sur les causes d'une place vacillante moins beaucoup de le faire sur le redimensionnement du combo lui-même.

J'ai effectivement atteint ceci dans VB.Net mais il devrait s'appliquer la même chose à C#.

1

Aucune des réponses à ce jour n'a fonctionné pour moi. La seule méthode fiable que j'ai trouvée consistait à poster un message de façon asynchrone via BeginInvoke qui remet à zéro SelectionLength après que toutes les autres activités sur le contrôle se soient terminées. La quantité de scintillement est très agaçante et peu professionnelle, mais c'est le meilleur que je pourrais trouver ... jusqu'à présent.

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

Je me demande si les autres réponses ici n'ont pas fonctionné pour vous parce que votre 'ComboBox' était dans un' TableLayoutPanel'? –

+0

@JeffRoe: Je ne me souviens pas des détails. C'était il y a trop longtemps, mais oui, c'est très possible. –

0

Gérez l'événement Resize pour le conteneur parent du ComboBox. Mettez cette ligne là-dedans:

MyComboBox.SelectionLength = 0

Exemple (VB, évidemment):

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

    MyComboBox.SelectionLength = 0 

End Sub 

Bonne chance à vous!

--BP

0

Cela semble être un bogue dans la mise en œuvre de Windows natif ComboBox avec DropDownStyle de DropDown.

Le correctif décrit dans les autres réponses ici (définition de la propriété SelectionLength à 0 (zéro) en cas de ResizeComboBox) fonctionne bien la plupart du temps.

Cependant, j'ai trouvé que même cette solution pour contourner ce bogue ne fonctionne pas toujours. Si le ComboBox est dans un TableLayoutPanel, et si ce TableLayoutPanel a plus d'une colonne avec un type de taille Percent, cette correction ne fonctionne souvent pas.

Une image vaut mille mots. Voir la capture d'écran suivante d'un formulaire que j'ai fait pour démontrer le problème.

enter image description here

Questions connexes