我在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按预期工作。
答案 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>>
切换到字典可能只是解决它。