Winform中以Dictionary为ComboBox数据源:选中后显示键而非值
WinForm ComboBox 绑定Dictionary实现下拉显示Value、选中后显示Key
要实现下拉列表显示省份名称(Dictionary的Value),选中后输入框显示对应编码(Dictionary的Key),仅通过设置DisplayMember和ValueMember无法实现,需要通过自定义绘制来控制显示内容,具体步骤如下:
实现步骤
- 保持原有的数据源绑定逻辑,确保下拉列表的数据源正确。
- 将ComboBox的
DrawMode设置为OwnerDrawFixed,开启自定义绘制。 - 处理
DrawItem事件,区分下拉列表项和输入框显示项,分别绘制Value和Key。
完整代码示例
public readonly Dictionary<string, string> Provinces = new() { { "01", "Ontario" }, { "02", "Quebec" }, { "03", "British Columbia" } }; public ProvincesView() { InitializeComponent(); // 绑定数据源 this.cbProvinces.DataSource = new BindingSource(Provinces, null); this.cbProvinces.DisplayMember = "Value"; this.cbProvinces.ValueMember = "Key"; // 开启自定义绘制模式 this.cbProvinces.DrawMode = DrawMode.OwnerDrawFixed; // 绑定绘制事件 this.cbProvinces.DrawItem += CbProvinces_DrawItem; // 可选:设置为下拉列表样式,禁止手动输入(避免显示混乱) this.cbProvinces.DropDownStyle = ComboBoxStyle.DropDownList; } private void CbProvinces_DrawItem(object sender, DrawItemEventArgs e) { var comboBox = sender as ComboBox; if (comboBox == null || e.Index < 0) return; // 获取当前项的键值对 var selectedItem = (KeyValuePair<string, string>)comboBox.Items[e.Index]; // 绘制控件背景 e.DrawBackground(); // 判断当前绘制的是下拉列表中的项,还是输入框显示的项 bool isDropDownItem = (e.State & DrawItemState.ComboBoxEdit) == 0; // 下拉项显示省份名称(Value),输入框显示编码(Key) string displayText = isDropDownItem ? selectedItem.Value : selectedItem.Key; // 绘制文本内容 using (var textBrush = new SolidBrush(e.ForeColor)) { e.Graphics.DrawString(displayText, e.Font, textBrush, e.Bounds); } // 绘制焦点框(提升交互体验) e.DrawFocusRectangle(); }
说明
- 通过
DrawItemState.ComboBoxEdit判断绘制的是输入框显示项还是下拉列表项,从而决定显示Key或Value。 - 设置
DropDownStyle = ComboBoxStyle.DropDownList可以禁止用户手动输入文本,避免显示逻辑混乱;若需要允许输入,可调整为DropDown并额外处理TextChanged事件。
内容的提问来源于stack exchange,提问作者lostwords
相关产品推荐
相关产品推荐

