Във 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
.
Пример (в 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}});
}
Просто използвайте свойството 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. работи и за върнати сложни типове, които получавате от изгледи/съхранени процедури в рамка на обект
И ако се случи да използвате речника като източник на данни, можете да използвате
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>