C# - 下拉列表

时间:2015-07-08 19:39:04

标签: c# drop-down-menu keyvaluepair

我在winform上放置了一个下拉控件。今天,此下拉菜单的数据源是KeyValuePair<'string','string'>因此,可以很容易地直接将下拉列表中的“DisplayMember”属性分配给KeyValuePair中的“Value”。

我的一个要求是将此数据源更改为KeyValuePair<'string',KeyValuePair<'string','string'>。当我运行我的代码时,这给我带来了问题。这是因为'DisplayMember'设置为'Value'会导致下拉项显示为('AB')(其中'A'和'B'是KeyValuePair中的相应字符串<'string','string'> of新的数据源)。

我想将下拉菜单的'DisplayMember'属性分配给KeyValuePair中的'Key'<'string','string'>来自更改的数据源。

旧要求 -

KeyValuePair<'string','string'>('A','B')

下拉项目显示 - 'B'

新要求 -

KeyValuePair<'string',KeyValuePair<'string','string'>('A', new KeyValuePair<'B','C'>)

下拉项应显示 - 'B'

是否可以仅使用下拉属性更改来实现工具?

检查了数据源,但它只显示了Key-Value对的顶层,而不是层次模型。

2 个答案:

答案 0 :(得分:1)

不幸的是,您无法使用DisplayMember绑定到嵌套属性。因此,尝试将DisplayMember设置为"Value.Key"之类的内容并不起作用。但是,我建议创建一个自定义类型,将KeyValuePair<string, KeyValuePair<string, string>>>类型包装到一个对象中,并为其提供易于访问的属性。这是一个例子:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // This was the old way 
        //List<KeyValuePair<string, KeyValuePair<string, string>>> myList = new List<KeyValuePair<string, KeyValuePair<string, string>>>();

        //myList.Add(new KeyValuePair<string, KeyValuePair<string, string>>("A", new KeyValuePair<string, string>("B", "C")));
        //myList.Add(new KeyValuePair<string, KeyValuePair<string, string>>("D", new KeyValuePair<string, string>("E", "F")));
        //myList.Add(new KeyValuePair<string, KeyValuePair<string, string>>("G", new KeyValuePair<string, string>("H", "I")));

        // This is the new way
        List<CustomKeyValuePairWrapper> myList = new List<CustomKeyValuePairWrapper>();
        myList.Add(new CustomKeyValuePairWrapper("A", new KeyValuePair<string, string>("B", "C")));
        myList.Add(new CustomKeyValuePairWrapper("D", new KeyValuePair<string, string>("E", "F")));
        myList.Add(new CustomKeyValuePairWrapper("G", new KeyValuePair<string, string>("H", "I")));

        comboBox1.DataSource = myList;
        comboBox1.DisplayMember = "ValueKey";
    }
}

public class CustomKeyValuePairWrapper
{

    public string Key { get; private set; }

    public KeyValuePair<string, string> Value { get; private set; }

    public string ValueKey
    {
        get { return Value.Key; }
    }

    public CustomKeyValuePairWrapper(string key, KeyValuePair<string, string> value)
    {
        Key = key;
        Value = value;
    }
}

答案 1 :(得分:0)

尝试以下方法:

public class CustomKeyValuePair
{
    public CustomKeyValuePair(string key, string value)
    {
        this.Key = key;
        this.Value = value;
    }
    public string Key { get; set; }
    public string Value { get; set; }
    public override string ToString()
    {
        return Key;
    }
}

KeyValuePair<'string',KeyValuePair<'string',CustomKeyValuePair>('A', new CustomKeyValuePair('B','C'))