WinForm ListBox 详解与案例
一、核心概念
ListBox 是 Windows 窗体中用于展示可滚动列表项的控件,支持单选或多选操作,适用于需要用户从固定数据集中选择一项或多项的场景。
二、核心属性
属性 | 说明 |
---|---|
Items | 管理列表项的集合,支持动态增删(如 Add()、Remove())。 |
SelectedIndex | 获取或设置选中项的索引(未选中时为 -1)。 |
SelectedItem | 获取当前选中的项对象。 |
SelectionMode | 设置选择模式:Single(默认)、MultiSimple 或 MultiExtended。 |
Sorted | 是否按字母顺序自动排序项。 |
ScrollAlwaysVisible | 始终显示滚动条(即使内容未超出可视区域)。 |
三、核心方法与事件
1、常用方法
- Items.Add():添加新项。
csharp
listBox1.Items.Add("新项");
。Items.RemoveAt():根据索引删除项
csharp
listBox1.Items.RemoveAt(0); // 删除第一项
- ClearSelected():取消所有选中项。
2、重要事件
SelectedIndexChanged:选中项变化时触发。
csharp
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
if (listBox1.SelectedItem != null) {
MessageBox.Show($"选中项:{listBox1.SelectedItem}");
}
}
四、完整案例
案例1:动态增删项
需求:通过按钮动态添加和删除列表项。
实现代码:
csharp
// 添加项
private void btnAdd_Click(object sender, EventArgs e) {
listBox1.Items.Add(txtInput.Text);
txtInput.Clear();
}
// 删除选中项
private void btnDelete_Click(object sender, EventArgs e) {
if (listBox1.SelectedIndex != -1) {
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
}
}
说明:输入框 txtInput 用于接收用户输入,删除时需检查是否有选中项。
案例2:多选操作与数据绑定
需求:从数据库加载数据并支持多选。
实现代码:
// 绑定数据源(示例使用List模拟数据库数据)
csharp
private void Form1_Load(object sender, EventArgs e) {
List<string> data = new List<string> { "北京", "上海", "广州", "深圳" };
listBox1.DataSource = data;
listBox1.SelectionMode = SelectionMode.MultiExtended; // 启用扩展多选
}
// 获取所有选中项
private void btnShowSelected_Click(object sender, EventArgs e) {
var selectedItems = listBox1.SelectedItems.Cast<string>().ToList();
MessageBox.Show($"选中城市:{string.Join(", ", selectedItems)}");
}
说明:DataSource 属性支持绑定集合数据,SelectionMode 控制多选模式。
案例3:排序与批量删除
需求:自动排序列表项,并批量删除符合条件的项。
实现代码:
csharp
// 启用排序
listBox1.Sorted = true;
// 批量删除包含"测试"的项
private void btnBatchDelete_Click(object sender, EventArgs e) {
for (int i = listBox1.Items.Count - 1; i >= 0; i--) {
if (listBox1.Items[i].ToString().Contains("测试")) {
listBox1.Items.RemoveAt(i); // 倒序删除避免索引错位
}
}
}
说明:倒序遍历避免因删除导致索引变化。
五、注意事项
性能优化:批量操作时使用 BeginUpdate() 和 EndUpdate() 减少界面刷新次数。
csharp
listBox1.BeginUpdate();
for (int i = 0; i < 1000; i++) {
listBox1.Items.Add($"Item {i}");
}
listBox1.EndUpdate();
索引管理:删除多项时需倒序操作,避免索引越界。
总结
ListBox 是 WinForm 中灵活且功能丰富的列表控件,通过合理使用 Items 集合、SelectionMode 及事件机制,可实现动态数据管理、多选交互等复杂场景。开发时需注意性能优化和索引逻辑,避免常见错误