12
votes

Comment rendre la liste déroulante ComboBox Redimensionnez-vous pour adapter le plus gros article?

J'ai un datagridview avec un ComboBox qui pourrait contenir de jolies chaînes. Y a-t-il un moyen d'avoir la liste déroulante se développer ou au moins wordwrap les chaînes afin que l'utilisateur puisse voir la chaîne entière sans que je doive redimensionner la largeur de la colonne ComboBox


0 commentaires

3 Réponses :


-3
votes

Non pas que je sache, bien que certains navigateurs soient suffisamment intelligents pour développer la largeur du menu déroulant au-delà de celle de la boîte si elle est nécessaire. Je sais que Firefox et Chrome peuvent le faire si vous êtes capable de contrôler un peu votre base d'utilisateurs.

Si vous êtes désespérément désespéré à quel point une boîte de liste déroulante basée sur Flash basée sur une boîte de liste déroulante sur HTML?


1 commentaires

Cherchait une réponse WinForms. Je devrais ajouter des winforms à la question. Désolé pour la confusion.



8
votes

Voici ce que j'ai fait pour résoudre ce problème, ça marche génial ... xxx


4 commentaires

Merci. J'ai choisi de modifier la propriété DropdownWidth dans l'événement déroulant.


Cela pourrait être une meilleure idée de vous abonner à DataSourCechanged , ValueMemberCommé et displaymemberchanged Événements au lieu de la protection de la propriété.


Puisqu'il s'agit d'un remplacement de classe, le moyen le plus propre est de simplement ajouter une substitution pour ondropdown pour ajouter l'appel là-bas avant d'exécuter base.ondropdown (e) . Et BTW, pour cette finale si> chèque, stockez simplement cette largeur dans une variable au lieu d'appeler ce calcul deux fois.


À propos, la chose "+15" à permettre à la barre de défilement peut être améliorée en vérifiant en réalité en vérifiant si elle est nécessaire et en récupérant la largeur réelle de la barre de défilement réelle: if (items.count * this.itemheight .Dropdownheight) WidestStringInpixels + = Systeminformation.verticalscrollBarwidth;



10
votes

Ceci est une solution très élégante:

private void AdjustWidthComboBox_DropDown(object sender, System.EventArgs e)
{
    ComboBox senderComboBox = (ComboBox)sender;
    int width = senderComboBox.DropDownWidth;
    Graphics g = senderComboBox.CreateGraphics();
    Font font = senderComboBox.Font;
    int vertScrollBarWidth = 
        (senderComboBox.Items.Count>senderComboBox.MaxDropDownItems)
        ?SystemInformation.VerticalScrollBarWidth:0;

    int newWidth;
    foreach (string s in senderComboBox.Items)
    {
        newWidth = (int) g.MeasureString(s, font).Width 
            + vertScrollBarWidth;
        if (width < newWidth )
        {
            width = newWidth;
        }
    }
    senderComboBox.DropDownWidth = width;
}


0 commentaires