Winform控件:Combobox

1.1 快速上手

  1. 拖一个 ComboBox 到窗体

  2. 填数据:

    comboBox1.Items.AddRange(new object[]{"北京","上海","广州","深圳"});
    // 或绑定数据源
    comboBox1.DataSource = list; // 任何 IList/BindingList
    comboBox1.DisplayMember = "Name"; // 对象属性
    comboBox1.ValueMember = "Id"; // 背后值

  3. 读取选中项:

    var txt = comboBox1.Text; // 显示文本
    var val = comboBox1.SelectedValue; // 背后值(绑定才有效)
    var idx = comboBox1.SelectedIndex; // -1 表示没选

1.2 核心属性速查表

|----------------------|-----------------|------------------------|
| 属性 | 典型值 | 作用 |
| DropDownStyle | DropDownList | 决定用户能否输入文本(见下一节) |
| AutoCompleteSource | CustomSource | 开启自动完成 |
| AutoCompleteMode | SuggestAppend | 自动完成模式 |
| MaxDropDownItems | 8 | 下拉最大可见行数 |
| IntegralHeight | false | 允许部分行高(自绘时有用) |
| Sorted | true | 对 Items 自动排序(绑定数据源时无效) |

|----------------|--------|------|----------------|
| 枚举值 | 用户能否输入 | 能否下拉 | 典型场景 |
| DropDown | ✅ | ✅ | 搜索框(带建议) |
| DropDownList | ❌ | ✅ | 只允许选择(最常用) |
| Simple | ✅ | ❌ | 像 ListBox 一直展开 |

1.4 事件大全(常用)

|------------------------|-------|----------------|
| 事件 | 触发时机 | 用途 |
| SelectedIndexChanged | 每次换项 | 联动界面、保存设置 |
| TextChanged | 输入文字时 | 搜索过滤、实时提示 |
| DropDownClosed | 下拉收起 | 延迟加载、清理资源 |
| KeyDown | 按键 | 自定义快捷键(如回车即提交) |

示例:回车直接提交

复制代码
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
        buttonOK.PerformClick();
}

1.5 自动完成(零代码)

设计器里设置:

复制代码
AutoCompleteSource = CustomSource
AutoCompleteCustomSource.AddRange(new string[]{"北京","北京朝阳","北京海淀"})
AutoCompleteMode = SuggestAppend

运行即可像搜索引擎一样下拉提示。

1.6 绑定对象 + 取值

复制代码
public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 窗体加载
var cities = new List<City>
{
    new City{Id=1, Name="北京"},
    new City{Id=2, Name="上海"}
};
comboBox1.DataSource = cities;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember   = "Id";

// 读取
City selected = (City)comboBox1.SelectedItem;  // 强类型
int id = selected.Id;

1.7 自绘项(图标 + 颜色)

设置 DrawMode = OwnerDrawFixed,处理 DrawItem

复制代码
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) return;
    string text = comboBox1.Items[e.Index].ToString();
    Color  backColor = (text == "上海") ? Color.LightPink : Color.White;

    e.Graphics.FillRectangle(new SolidBrush(backColor), e.Bounds);
    e.Graphics.DrawString(text, e.Font, Brushes.Black, e.Bounds.Left + 2, e.Bounds.Top + 2);
    e.DrawFocusRectangle();
}

效果:每项背景色不同,甚至加图标(用 e.Graphics.DrawImage)。

1.8 异步加载(大数据源)

复制代码
await Task.Run(() =>
{
    var hugeList = GetDataFromDB();   // 耗时
    this.Invoke(() =>
    {
        comboBox1.DataSource = hugeList;
        comboBox1.DisplayMember = "Name";
    });
});

避免 UI 卡顿。

1.9 常见坑速查

|--------------------------|--------------------------------|------------------------------------------|
| 现象 | 原因 | 解决 |
| 下拉空白 | IntegralHeight=false + 行高<1 | 设 IntegralHeight=true 或调高 ItemHeight |
| SelectedIndex=-1 | 清空后未复位 | 手动赋 SelectedIndex = -1 |
| 绑定后 SelectedValue 为 null | 未设 ValueMember | 指定 ValueMember = "Id" |
| 输入文字不触发事件 | DropDownStyle=DropDownList | 改为 DropDown 即可输入 |

cs 复制代码
//向集合追加单个成员
comboBox1.Items.Add("正弦信号");
comboBox1.Items.Add("脉冲信号");
//向集合追加数组成员
comboBox1.Items.AddRange(new string[] { "设置", "参数", "OK" });
//选择哪一个
comboBox1.SelectedIndex = 0;
//设定字体
comboBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10,FontStyle.Bold);

 // 读取当前选择的项名称
string str3 = comboBox1.SelectedText;  
 // 获取当前选择的对象
string str2 = comboBox1.SelectedItem.ToString();
 // Text 获取的为控件显示的内容
string str = comboBox1.Text;
相关推荐
政采云技术3 小时前
前端设计模式详解
前端·设计模式
前端开发爱好者3 小时前
字节出手!「Vue Native」真的要来了!
前端·javascript·vue.js
前端开发爱好者3 小时前
国产 Canvas 引擎!神器!
前端·javascript·vue.js
Canace3 小时前
浏览器渲染原理概述
前端·性能优化·浏览器
啃火龙果的兔子4 小时前
前端八股文性能调优篇
前端·前端框架
JarvanMo4 小时前
停止与 Compose 导航作斗争(这 5 个技巧将改变一切)
前端
张人玉4 小时前
WPF 数据绑定详解
windows·c#·wpf
trsoliu4 小时前
前端周刊第437期:AI编程助手、WebGPU实战与React生态新动态
前端
trsoliu4 小时前
2025年Web前端前沿技术动态:WebGL动画、CSS View Transitions与HTML隐藏API
前端·javascript·css