如何识别与一组数据相关的选定 ComboBox 项?

Posted

技术标签:

【中文标题】如何识别与一组数据相关的选定 ComboBox 项?【英文标题】:How do I identify the selected ComboBox's Item relating it to a set of data? 【发布时间】:2017-08-06 17:01:25 【问题描述】:

假设我有一组固定的标识符,例如字典。

public static Dictionary<int, string> clientIds = new Dictionary<int, string>()

     0, "aa" ,
     1, "ab"  ,
     2, "ac" ,
     3, "ba" ,
     4, "bb" 
;

然后,我在运行时动态添加与这些标识符相关的ComboBox“友好名称”(但我不知道会添加哪些。

clientIdCombo.Add(friendlyName);

假设在索引 0 处添加了友好名称“Alpha Beta”。这将与“ab”标识符有关。我如何知道用户选择了“ab”标识符,而不必根据组合上显示给用户的文本进行条件处理?我尝试改用BindingList,但这也只为我提供了显示的文本。

听起来很简单——如何将基础数据添加到每个ComboBox 索引?尽管欢迎多种解决方案,但最简单的方法会更可取。

谢谢。

【问题讨论】:

只使用选定的项目索引作为字典键... 见***.com/questions/6412739/… Binding Combobox Using Dictionary as the Datasource的可能重复 @apocalypse 但我不知道将在哪个索引处添加项目,这会在运行时根据用户输入发生。 @JohnsonWhitler:然后试试这个:***.com/questions/3063320/… 【参考方案1】:

ComboBox 项目可以是您喜欢的任何类型,项目的显示名称将由该类型的 ToString 方法定义。

这意味着您可以像这样定义您的项目类型:

class ClientItem

    public int Index;
    public string Id;
    public string FriendlyName;
    public override string ToString()
    
        return FriendlyName;
    

然后用这个类的实例填充你的组合框。

comboBox.Items.Add(new ClientItem  
    Index = 1,
    Id = "ab",
    FriendlyName = "Alpha Beta",
);

然后您可以使用组合框项目访问所有项目的数据。只记得投射到特定的项目类型:

var client = comboBox.SelectedItem as ClientItem;
MessageBox.Show(client.Id + ": " + client.FriendlyName);

【讨论】:

很好的解决方案,谢谢。或者,是否可以简单地将 ComboBox.DisplayMember 和 ComboBox.ValueMember 分配给通用变量?【参考方案2】:

只需向 ComboBox 添加与数组中一样多的项,每个项都有其对应的文本,并且与它们在数组中的顺序相同。然后,当您想从数组中获取选定项时,使用ComboBox.SelectedIndex 获取选定索引并从数组中获取与该索引对应的项。在您的情况下,您使用的是 int-indexed 字典,它在索引方面就像一个数组。

TLDR:

string[] array = new[]  "aa", "ab", "ac" ;

//This array is "equivalent" to
Dictionary<int, string> dic= new Dictionary<int, string>()

     0, "aa" ,
     1, "ab" ,
     2, "ac" ,
;

//Add the items to your ComboBox, for simplicity let's use this
ComboBox.Items.Add("Alfa Alfa");
ComboBox.Items.Add("Alfa Bravo");
ComboBox.Items.Add("Alfa Charlie");

//Later, when retrieving the selected item
int selIndex = ComboBox.SelectedIndex;
string selItem = array[selIndex];

【讨论】:

这是一种方法,以防您确定将所有项目添加到 ComboBox 上。在我的场景中,我不知道会添加哪个,例如可能不会添加“Alfa Alfa”,但直到运行时我才会知道,这使得仅基于 SelectedIndex 的检索是不可能的。

以上是关于如何识别与一组数据相关的选定 ComboBox 项?的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM 将 ComboBox 绑定到 Datagrid 选定项

如何从选定的 WPF ComboBox 项 C# 中显示内容

Windows 10 中的 XAML ComboBox 选定项背景颜色

MFC 获取Combo Box控件 当前选定项的序号和文本内容

如何在 ReactJS 中更改单选按钮时重置选定的下拉列表

WPF IsEditable=true 填充了对象的 ComboBox 将 ToString() 显示为选定项