web-dev-qa-db-fra.com

Comment définir la hauteur d'une ComboBox?

J'ai une ComboBox sur un formulaire et sa hauteur par défaut est 21. Comment puis-je le changer?

22
Gaddigesh

ComboBox taille automatiquement pour s'adapter à la police. Désactiver cela n'est pas une option. Si vous voulez plus gros, donnez-lui une police plus grande.

24
Hans Passant

Définissez DrawMode sur OwnerDrawVariable. Cependant, la personnalisation de la ComboBox pose d'autres problèmes. Voir ce lien pour un tutoriel sur la façon de le faire complètement:

http://www.csharphelp.com/2006/09/listbox-control-in-c/

OwnerDrawVariable exemple de code ici: https://msdn.Microsoft.com/en-us/library/system.windows.forms.combobox.drawitem%28v=vs.110%29.aspx

Une fois que cela est fait, vous devez définir la propriété ItemHeight de la liste déroulante pour définir la hauteur effective de celle-ci. 

12
code4life

Autre option: si vous souhaitez augmenter la hauteur de la variable ComboBox sans augmenter la taille de la police ni vous soucier de tout dessiner vous-même, vous pouvez utiliser un simple appel d'API Win32 pour augmenter la hauteur de la manière suivante:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Win32ComboBoxHeightExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
        private const Int32 CB_SETITEMHEIGHT = 0x153;

        private void SetComboBoxHeight(IntPtr comboBoxHandle, Int32 comboBoxDesiredHeight)
        {
            SendMessage(comboBoxHandle, CB_SETITEMHEIGHT, -1, comboBoxDesiredHeight);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SetComboBoxHeight(comboBox1.Handle, 150);
            comboBox1.Refresh();
        }
    }
}

Résultat:

 enter image description here

6
Calcolat

Pour ce faire, vous devez définir la variable DrawMode sur OwnerDrawVariable ou OwnerDrawFixed et dessiner manuellement vos éléments. Cela peut être fait avec une classe assez simple.

Cet exemple vous permettra d'utiliser la propriété ItemHeight de la zone de liste déroulante quelle que soit la taille de la police. J'ai ajouté une propriété de bonus TextAlign qui vous permettra également de centrer les éléments.

Une chose à noter est que vous devez définir DropDownStyle sur DropDownList pour que l'élément sélectionné respecte nos personnalisations.

// The standard combo box height is determined by the font. This means, if you want a large text box, you must use a large font.
// In our class, ItemHeight will now determine the height of the combobox with no respect to the combobox font.
// TextAlign can be used to align the text in the ComboBox
class UKComboBox : ComboBox
{

    private StringAlignment _textAlign = StringAlignment.Center;
    [Description("String Alignment")]
    [Category("CustomFonts")]
    [DefaultValue(typeof(StringAlignment))]
    public StringAlignment TextAlign
    {
        get { return _textAlign; }
        set
        {
            _textAlign = value;
        }
    }

    private int _textYOffset = 0;
    [Description("When using a non-centered TextAlign, you may want to use TextYOffset to manually center the Item text.")]
    [Category("CustomFonts")]
    [DefaultValue(typeof(int))]
    public int TextYOffset
    {
        get { return _textYOffset; }
        set
        {
            _textYOffset = value;
        }
    }


    public UKComboBox()
    {
            // Set OwnerDrawVariable to indicate we will manually draw all elements.
            this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
            // DropDownList style required for selected item to respect our DrawItem customizations.
            this.DropDownStyle = ComboBoxStyle.DropDownList;
            // Hook into our DrawItem & MeasureItem events
            this.DrawItem +=
                new DrawItemEventHandler(ComboBox_DrawItem);
            this.MeasureItem +=
                new MeasureItemEventHandler(ComboBox_MeasureItem);

    }

    // Allow Combo Box to center aligned and manually draw our items
    private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
    {


        // Draw the background
        e.DrawBackground();

        // Draw the items
        if (e.Index >= 0)
        {
            // Set the string format to our desired format (Center, Near, Far)
            StringFormat sf = new StringFormat();
            sf.LineAlignment = _textAlign;
            sf.Alignment = _textAlign;

            // Set the brush the same as our ForeColour
            Brush brush = new SolidBrush(this.ForeColor);

            // If this item is selected, draw the highlight
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                brush = SystemBrushes.HighlightText;

            // Draw our string including our offset.
            e.Graphics.DrawString(this.Items[e.Index].ToString(), this.Font, brush, 
                new RectangleF(e.Bounds.X, e.Bounds.Y + _textYOffset, e.Bounds.Width, e.Bounds.Height), sf);
        }

    }


    // If you set the Draw property to DrawMode.OwnerDrawVariable, 
    // you must handle the MeasureItem event. This event handler 
    // will set the height and width of each item before it is drawn. 
    private void ComboBox_MeasureItem(object sender,System.Windows.Forms.MeasureItemEventArgs e)
    {
        // Custom heights per item index can be done here.
    }

}

Maintenant, nous avons le plein contrôle sur notre police et la hauteur de la ComboBox séparément. Nous n'avons plus besoin de créer une police de grande taille pour notre ComboBox.

 enter image description here

1
clamchoda

Si vous souhaitez ajuster le nombre d'éléments de la zone de liste déroulante, vous pouvez modifier la valeur de DropDownHeight comme suit, à partir d'une liste d'éléments. J'utilise 24 ici comme "montant par article"; ce n'est en aucun cas fixé.

  comboBox1.DropDownHeight = SomeList.Count * 24;
0
Gary Huckabone