ComboBox和KeyValuePair列表无法正常工作

时间:2012-08-16 13:55:44

标签: c# winforms

我在Windows Forms表单上创建了一个ComboBox。它是数据绑定到TableAdapter中的列,而DataSource是手动创建的KeyValuePair列表。问题是当表格显示时; ValueMember显示在ComboBox中,而不是DisplayMember中。如果单击下拉列表,将显示“键列表值”。在进行选择时,在OnValidating方法中,SelectedItem为-1。

我相信ComboBox设置正确。我做错了什么?

this.cboFormat.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.BindingSource, "Format", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

InitializeComponent();

List<KeyValuePair<int, string>> loFormat = new List<KeyValuePair<int, string>>();
loFormat.Add(new KeyValuePair<int, string>(1, "Format 1"));
loFormat.Add(new KeyValuePair<int, string>(2, "Format 2"));
loFormat.Add(new KeyValuePair<int, string>(3, "Format 3"));

this.cboFormat.DataSource = new BindingSource(loFormat, null);
this.cboFormat.DisplayMember = "Value";
this.cboFormat.ValueMember = "Key";

问题解决了:

我发现如果DataBinding中的Column是一个int,但List中的Value是一个字符串,那么上面的问题就会产生。我将数据绑定更改为一个视图,该视图显示了与int绑定的查找表中的文本。列表的键将是查找表中的int。如果这是有道理的。

SELECT DisplayMember FROM LookupTable AS LT INNER JOIN DataTable AS DT ON LT.Id = DT.LookupId.

然后KeyValuePair按预期工作。

2 个答案:

答案 0 :(得分:4)

我把一个带有ComboBox和Button的窗口放在一起。我根本没有看到你描述的内容。我的代码看起来像这样:

    BindingSource bs = new BindingSource();
    public Form1()
    {
        InitializeComponent();
        comboBox1.DataBindings.Add(new Binding("Text", bs, "Format", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
        List<KeyValuePair<int, string>> loFormat = new List<KeyValuePair<int, string>>();
        loFormat.Add(new KeyValuePair<int, string>(1, "Format 1"));
        loFormat.Add(new KeyValuePair<int, string>(2, "Format 2"));
        loFormat.Add(new KeyValuePair<int, string>(3, "Format 3"));
        comboBox1.DataSource = new BindingSource(loFormat, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";
    }

    private void comboBox1_Validating(object sender, CancelEventArgs e)
    {
        Console.WriteLine(comboBox1.SelectedItem);
    }

验证处理程序具有正确的选定项目,并且初始化正常。也许这是你没有在你的代码片段中显示的其他内容。

答案 1 :(得分:0)

为什么使用List<KeyValuePair<int,string>>代替Dictionary<int,string>

无论如何,我确实认为你的问题在于,因为绑定是针对KeyValuePair的List完成的;代码会认为它应该在List中查找DisplayMember的值(即不是KeyValuePair),并且发现Value是KeyValue并且找不到任何Key,所以它做了一些奇怪的解析(READ:不确定)为什么你得到-1)。 认为从List<KeyValuePair<int,string>>切换到字典可能只是解决它。