В vb.net/winforms, как хеш-таблица может быть привязана к раскрывающемуся списку или любому другому элементу управления, управляемому источником данных?
Как хеш-таблица может быть привязана к выпадающему списку?
Ответы (6)
Это winforms, wpf или asp.net? [обновление: ааа... winforms ;-p]
winforms хочет, чтобы данные были IList
(или, косвенно, через IListSource
), поэтому я предполагаю (из комментария), что вы используете winforms. Ни одна из встроенных коллекций, похожих на словари, не реализует IList
, но, честно говоря, это не имеет значения: если вы привязываете данные, объем, вероятно, довольно мал, поэтому обычный список должен подойти.
Лучший вариант — что-то вроде List<T>
или BindingList<T>
, где T
содержит все свойства, к которым вы хотите привязаться. Это вариант? Если вы застряли на 1.1 (поскольку вы упоминаете HashTable
, а не Dictionary<,>
), используйте ArrayList
.
Пример (на С#):
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}});
}
Просто используйте свойство 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();
Пример для данного объекта с именем 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>