【发布时间】:2010-09-22 20:55:30
【问题描述】:
在 vb.net/winforms 中,如何将哈希表绑定到下拉列表或任何其他数据源驱动的控件?
【问题讨论】:
-
如果有什么不同的话,我真的在使用 System.Windows.Forms.Combobox,带有 DropDownList 下拉样式。
标签: .net vb.net data-binding drop-down-menu hashtable
在 vb.net/winforms 中,如何将哈希表绑定到下拉列表或任何其他数据源驱动的控件?
【问题讨论】:
标签: .net vb.net data-binding drop-down-menu hashtable
只需使用下拉列表的 Datasource 属性
DropDownList dd = new DropDownList();
Hashtable mycountries = New Hashtable();
mycountries.Add("N","Norway");
mycountries.Add("S","Sweden");
mycountries.Add("F","France");
mycountries.Add("I","Italy");
dd.DataSource=mycountries;
dd.DataValueField="Key";
dd.DataTextField="Value";
dd.DataBind();
【讨论】:
这是 winforms、wpf 还是 asp.net? [更新:啊……winforms ;-p]
winforms 希望数据为IList(或间接通过IListSource)-所以我猜测(从评论中)您正在使用winforms。没有一个内置的类字典集合实现IList,但老实说,这并不重要:如果你是数据绑定,体积可能相当小,所以一个常规列表应该没问题。
最好的选择类似于List<T> 或BindingList<T>,其中T 具有您要绑定的所有属性。这是一个选项吗?如果您坚持使用 1.1(因为您提到 HashTable 而不是 Dictionary<,>),请使用 ArrayList。
示例(在 C# 中):
class MyData
{
public int Key { get; set; }
public string Text { get; set; }
}
[STAThread]
static void Main()
{
var data = new List<MyData>
{
new MyData { Key = 1, Text = "abc"},
new MyData { Key = 2, Text = "def"},
new MyData { Key = 3, Text = "ghi"},
};
ComboBox cbo = new ComboBox
{
DataSource = data,
DisplayMember = "Text",
ValueMember = "Key"
};
cbo.SelectedValueChanged += delegate {
Debug.WriteLine(cbo.SelectedValue);
};
Application.Run(new Form {Controls = {cbo}});
}
【讨论】:
名为 Order 的给定对象的示例:
List<Order> list = new List<Order>{};
foreach (Order o in OOS.AppVars.FinalizedOrders.Values)
{
list.Add(o);
}
this.comboBox_Orders.DataSource = list;
this.comboBox_Orders.DisplayMember = "Description";
这很酷的是,您可以将数据作为原始对象从列表中取回(而不仅仅是 asp.net 中的值字段)。
Order order = (Order)this.comboBox_Orders.SelectedValue;
【讨论】:
使用 .tolist。它也适用于您从实体框架中的视图/存储过程中获得的返回复杂类型
【讨论】:
而且,如果你碰巧使用 Dictionary 作为数据源,你可以使用
MyDDL.Datasouce = myDict.ToList();
它会将其转换为列表类型。
【讨论】:
myCtrl.DataSource = myHashtable
myCtrl.DataBind()
可绑定控件的示例来源:
<itemtemplate>
<%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
<%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
【讨论】: