我正在使用Visual Studio 2010 express并在C#WinForms应用程序上工作。
我的表单有一个ListBox对象(listData
),其DataSource
设置为使用键值对的Dictionary对象(dictionary
)。
这是字典及其如何分配为DataSource
到listData
-
Dictionary<string, uint> dictionary = new Dictionary<string, uint>();`
listData.DataSource = new BindingSource(dictionary, null);
listData.DisplayMember = "Key";
listData.ValueMember = "Value";
在调试时,我看到“Value”被正确分配,显然是一个数字。然而,当我尝试将相同的“值”接受到uint lastSelectedIndex
时,我得到了这个强制转换错误 -
我在这里做错了什么?
这实际上对我有用:
lastSelectedIndex = ((KeyValuePair<string, uint>)listData.SelectedItem).Value;
答案 0 :(得分:3)
你应该改变这一行。
listData.DataSource = new BindingSource(dictionary, null);
到
listData.DataSource = dictionary;
BindingSource构造函数需要两个参数。第一个用于数据源,第二个用于DataMember(我们可以说是ValueMember)。您已在第二个参数中指定了null值,这是BindingSource将整个KeyValuePair对象作为DataMember的原因。
我不认为你需要创建BindingSource类的对象来绑定Dictionary类。但是,如果您仍想使用,那么您还应该在第二个参数中指定DataMember。
listData.DataSource = new BindingSource(dictionary, "Value");
但是,我不知道它是否会起作用。我之前没想过这样。
另一种方法是将SelectedValue转换为KeyValuePair
对象并从中获取值。
uint lastSelectedIndex = ((KeyValuePair<string, uint>)listData.SelectedValue).Value
您正在尝试将KeyValuePair
对象转换为uint。所以,它无法转换。您必须先将其转换为KeyValuePair
类型,然后从该对象的Value
属性中获取值。
我建议你创建另一个类,其中类有两个属性
public class MyDataClass
{
public uint Value{ get; set;}
public string Display{get;set;}
public MyDataClass(string display, uint val)
{
Display = display;
Value = val;
}
public override string ToString()
{
return this.Display;
}
}
创建一个List<MyDataClass>
对象并将数据填入其中。
现在您可以将List对象直接分配到该List控件中。
List<MyDataClass> lstItems = new List<MyDataClass>();
lstItems.Add(new MyDataClass("Item 1", 1));
lstItems.Add(new MyDataClass("Item 2", 2));
lstItems.Add(new MyDataClass("Item 3", 3));
listData.DataSource = lstItems;
listData.DisplayMember = "Display";
listData.ValueMember = "Value";
答案 1 :(得分:1)
此问题的原因是您用于分配DataSource
和ListBox'ValueMember
属性的顺序。如果您将DataSource
指定为最后一步,则可以使用:
Dictionary<string, uint> dictionary = new Dictionary<string, uint>();
dictionary.Add("1", 1);
dictionary.Add("2", 2);
dictionary.Add("3", 3);
listData.DisplayMember = "Key";
listData.ValueMember = "Value";
var bs = new BindingSource();
bs.DataSource = dictionary;
listData.DataSource = bs; // as last step
一旦分配了DataSource,就会触发ListBox'SelectedIndexChanged
事件。由于您当时未指定ValueMember
,因此您获得InvalidCastException
。