Windows Forms ComboBox
FAQ Home
1.
How can I programmatically prevent the combobox from dropping?
2. How can I turn off editing in the textbox portion of a ComboBox, restricting the user to selecting only those options in the drop
list?
3. How do I implement an owner drawn combobox?
4. How do I add a ComboBox button to a toolbar?
5. How do I set the width of a combobox to fit the entries in
its list?
6. How can I programmatically create a new list for my
ComboBox dropdown?
1 How can I programmatically prevent the combobox from
dropping?
You can avoid the combobox dropping by overriding its WndProc
method and ignoring the WM_LBUTTONDOWN and
WM_LBUTTONDBLCLK.
[C#]
public class MyComboBox : ComboBox
{
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if(m.Msg == 0x201 //WM_LBUTTONDOWN
|| m.Msg == 0x203) //WM_LBUTTONDBLCLK
return;
base.WndProc(ref m);
}
}
[VB.NET]
Public Class MyComboBox
Inherits ComboBox
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = &H201 OrElse m.Msg = &H203 Then 'WM_LBUTTONDOWN or
WM_LBUTTONDBLCLK
Return
End If
MyBase.WndProc(m)
End Sub 'WndProc
End Class 'MyComboBox
2 How can I turn off editing in the textbox portion of a
ComboBox, restricting the user to selecting only those options in the drop
list?
Set the combobox's DropDownStyle property to
DropDownList .
3 How do I implement an owner drawn combobox?
You can subclass ComboBox. In your derived class, make sure you set
this.DrawMode =
System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.DropDownStyle = ComboBoxStyle.DropDownList;
You also need to handle the DrawItem event to actually
implement the drawing. Check out the details in the OwnerDrawnComboBox
sample.
4 How do I add a ComboBox button to a toolbar?
Michael Gold discusses this problem in How to create a ComboBox button in a
toolbar in .NET on
C#
Corner.
5 How do I set the width of a combobox to fit the
entries in its list?
You can iterate through the list to find the longest text extent using
MeasureString, and then use this as the combobox width adding a
fudge factor for the dropdown button.
System.Drawing.Graphics g =
comboBox1.CreateGraphics();
float maxWidth = 0f;
foreach(object o in comboBox1.Items)
{
float w = g.MeasureString(o.ToString(), comboBox1.Font).Width;
if(w > maxWidth)
maxWidth = w;
}
g.Dispose();
comboBox1.Width = (int) maxWidth + 20; // 20 is to take care of button
width
6 How can I programmatically create a new list for my
ComboBox dropdown?
Here are some snippets. (Courtesy of Michael Lang)
[C#]
DataTable list = new DataTable();
list.Columns.Add(new DataColumn("Display", typeof(string)));
list.Columns.Add(new DataColumn("Id", typeof(int)));
list.Rows.Add(list.NewRow());
list.Rows.Add(list.NewRow());
list.Rows.Add(list.NewRow());
list.Rows[0][0] = "one";
list.Rows[0][1] = 1;
list.Rows[1][0] = "two";
list.Rows[1][1] = 2;
list.Rows[2][0] = "three";
list.Rows[2][1] = 3;
comboBox1.DataSource = list;
comboBox1.DisplayMember = "Display";
comboBox1.ValueMember = "Id";
[VB.NET]
Dim list As New DataTable()
list.Columns.Add(New DataColumn("Display", GetType(String)))
list.Columns.Add(New DataColumn("Id", GetType(Integer)))
list.Rows.Add(list.NewRow())
list.Rows.Add(list.NewRow())
list.Rows.Add(list.NewRow())
list.Rows(0)(0) = "one" '
list.Rows(0)(1) = 1 '
list.Rows(1)(0) = "two" '
list.Rows(1)(1) = 2 '
list.Rows(2)(0) = "three" '
list.Rows(2)(1) = 3 '
comboBox1.DataSource = list
comboBox1.DisplayMember = "Display"
comboBox1.ValueMember = "Id"
|