ComponentOne(现为 GrapeCity Developer Solutions 的一部分)是一套高性能、轻量级的 .NET UI 控件库,支持 WinForms、WPF、MVC、Blazor 等多个平台。其 `C1ComboBox` 控件功能强大,特别适合用于实现 **输入即搜索**、**智能筛选下拉项** 等现代 UI 需求。
---
### ✅ 使用 ComponentOne 实现“输入文本自动搜索”功能
下面是一个完整的 C# 示例,展示如何使用 **C1.Win.C1Input.C1ComboBox** 实现用户在输入时自动筛选下拉列表中的项目。
> 🔧 前提:已安装 ComponentOne for WinForms 并添加引用
> 可通过 [GrapeCity 官网](https://www.grapecity.com/componentone) 下载试用版或购买授权。
---
### ✅ 完整代码示例:C1ComboBox 输入自动搜索
```csharp
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using C1.Win.C1Input;
public class FormWithC1Combo : Form
{
private C1ComboBox c1Combo;
private List<string> originalItems;
public FormWithC1Combo()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.Text = "ComponentOne C1ComboBox 自动搜索示例";
this.Size = new Size(300, 200);
this.StartPosition = FormStartPosition.CenterScreen;
// 初始化数据源
originalItems = new List<string>
{
"北京", "上海", "广州", "深圳", "杭州", "南京", "南昌", "宁波", "青岛", "厦门",
"成都", "重庆", "西安", "长沙", "武汉", "福州", "合肥", "海口"
};
// 创建 C1ComboBox
c1Combo = new C1ComboBox();
c1Combo.Location = new Point(50, 50);
c1Combo.Width = 200;
c1Combo.Font = new Font("Segoe UI", 9.75f);
c1Combo.DropDownStyle = C1ComboBoxDropDownStyle.DropDown; // 允许编辑
c1Combo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
// 🔑 关键设置:启用包含匹配模式(输入任意字符都可触发过滤)
c1Combo.AutoSearch = AutoSearchMode.Contains;
// 绑定原始数据
foreach (var item in originalItems)
{
c1Combo.Items.Add(item);
}
// 可选:监听选择事件
c1Combo.SelectedValueChanged += (s, e) =>
{
if (c1Combo.SelectedItem != null)
MessageBox.Show("你选择了: " + c1Combo.SelectedItem.ToString());
};
this.Controls.Add(c1Combo);
// 可选:添加说明标签
Label label = new Label();
label.Text = "输入城市名进行搜索...";
label.Location = new Point(50, 20);
label.AutoSize = true;
this.Controls.Add(label);
}
}
```
---
### 📌 核心属性说明
| 属性 | 说明 |
|------|------|
| `DropDownStyle = DropDown` | 允许用户输入和下拉选择 |
| `AutoCompleteMode = SuggestAppend` | 显示建议并自动补全 |
| `AutoSearch = Contains` | 支持“包含”匹配(如输入“南” → 匹配“南京”、“南昌”) |
| `AutoSearchTimeout` | 设置搜索延迟时间(毫秒),避免频繁触发 |
| `Filter` | 可设置自定义过滤器(高级用法) |
---
### ✅ 进阶:启用拼音首字母搜索(如输入 "bj" 匹配 "北京")
ComponentOne 默认不支持拼音搜索,但你可以通过 **自定义过滤逻辑** 实现:
#### 示例:扩展 C1ComboBox 支持拼音搜索(简化版)
```csharp
// 添加 NuGet 包:Pinyin4Net 或 ChinaseConverter
// 此处使用一个简易映射模拟
private Dictionary<string, string> pinyinMap = new Dictionary<string, string>
{
{ "北京", "beijing" }, { "上海", "shanghai" }, { "广州", "guangzhou" },
{ "深圳", "shenzhen" }, { "杭州", "hangzhou" }, { "南京", "nanjing" },
{ "南昌", "nanchang" }, { "宁波", "ningbo" }
};
private void c1Combo_TextChanged(object sender, EventArgs e)
{
string query = c1Combo.Text.ToLower();
if (string.IsNullOrWhiteSpace(query)) return;
// 自定义过滤:检查中文或拼音匹配
var matched = new List<string>();
foreach (var item in originalItems)
{
if (item.Contains(query, StringComparison.OrdinalIgnoreCase))
{
matched.Add(item);
continue;
}
// 检查拼音是否包含查询词
if (pinyinMap.TryGetValue(item, out string pinyin))
{
if (pinyin.StartsWith(query) || GetPinyinInitials(pinyin).StartsWith(query))
{
matched.Add(item);
}
}
}
// 动态更新下拉项
c1Combo.Items.Clear();
foreach (var m in matched)
c1Combo.Items.Add(m);
// 保持输入框文本不变
c1Combo.Text = query;
c1Combo.SelectionStart = query.Length;
}
// 获取拼音首字母缩写(如 beijing → bj)
private string GetPinyinInitials(string pinyin)
{
var parts = pinyin.Split(' ');
char[] initials = Array.ConvertAll(parts, s => s[0]);
return new string(initials);
}
```
> ⚠️ 注意:需将上述逻辑结合 `TextChanged` 和 `LostFocus` 事件管理焦点与还原原始项。
---
### 💡 优势总结
| 特性 | 说明 |
|------|------|
| 轻量高效 | 相比 DevExpress 更小的体积 |
| 易于集成 | 提供 Visual Studio 设计器支持 |
| 高性能 | 支持虚拟化加载万级数据 |
| 多平台 | 支持 WinForms / WPF / Blazor 等 |
| 文档完善 | 官方文档详细,示例丰富 |
---
### 🔗 官方资源
- 官网:[https://www.grapecity.com/componentone](https://www.grapecity.com/componentone)
- 下载地址:[https://www.grapecity.com/componentone/download](https://www.grapecity.com/componentone/download)
- 文档中心:[https://help.grapecity.com/](https://help.grapecity.com/)
---
###