Gaddigesh
Gaddigesh

Reputation: 1953

How do I set the height of a ComboBox?

I have a ComboBox on a form, and its default height is 21. How do I change it?

Upvotes: 36

Views: 85497

Answers (7)

user3068170
user3068170

Reputation: 19

ComboBox has a property 'DropDownHeight' which can be changed either via the properties window of the combobox or programmatically. i.e.

public partial class EventTestForm : Form
{
    public EventTestForm()
    {
        InitializeComponent();
        cmbOwners.DropDownHeight = 100;
    }

Upvotes: -1

clamchoda
clamchoda

Reputation: 4941

To do this, you need to set the DrawMode to OwnerDrawVariable or OwnerDrawFixed and manually draw your items. This can be done with a pretty simple class.

This example will allow you to use the ItemHeight property of the ComboBox regardless of font size. I threw in an bonus property TextAlign which will also allow you to center the items.

One thing worth mentioning is, you must set DropDownStyle to DropDownList for the selected item to respect our customizations.

// 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.
    }

}

Now we have full control over our font and height of the ComboBox separately. We no longer need to make a large font to size our ComboBox.

enter image description here

Upvotes: 5

Gary Huckabone
Gary Huckabone

Reputation: 412

If you are wanting to adjust to the number of items in the ComboBox you can change the value of the DropDownHeight as follows, given a List of items. I'm using 24 here as a "per item amount"; this is by no means fixed.

  comboBox1.DropDownHeight = SomeList.Count * 24;

Upvotes: 0

code4life
code4life

Reputation: 15794

Set the DrawMode to OwnerDrawVariable. However customization of the ComboBox leads to other issues. See this link for a tutorial on how to do this completely:

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

OwnerDrawVariable sample code here: https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.drawitem%28v=vs.110%29.aspx

Once that's done, you need to set the ItemHeight property of the combobox to set the effective height of the combobox.

Upvotes: 18

Calcolat
Calcolat

Reputation: 898

Just as another option, if you'd like to increase the height of the ComboBox without increasing the font size or having to worry about drawing everything yourself, you can use a simple Win32 API call to increase the height like this:

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();
        }
    }
}

Result:

enter image description here

Upvotes: 13

Hans Passant
Hans Passant

Reputation: 941237

ComboBox auto-sizes to fit the font. Turning that off is not an option. If you want it bigger then give it a bigger font.

Upvotes: 42

duraz0rz
duraz0rz

Reputation: 397

In code, a.Height should work. In the designer, go into the properties and look in Size->Height.

Alternatively, you can change the Font Size and the combo box will grow bigger to accomodate it, but I don't think that's what you want.

Upvotes: -1

Related Questions