Как може хеш-таблица да бъде обвързана с падащ списък?

Във vb.net / winforms, как хеш-таблица може да бъде обвързана с падащ списък или друг контрол, управляван от източник на данни?


person Jeffrey    schedule 18.11.2008    source източник
comment
Ако има някаква разлика, аз наистина използвам System.Windows.Forms.Combobox, със стила на падащия списък DropDownList.   -  person Jeffrey    schedule 18.11.2008


Отговори (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}});
}
person Marc Gravell    schedule 18.11.2008
comment
Вие сте абсолютно прав - това е проект на winforms. Не знаех, че ще има такава разлика. Много благодаря. - person Jeffrey; 18.11.2008

Просто използвайте свойството 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();
person Charles Bretana    schedule 18.11.2008
comment
Това по някаква причина ми дава тази грешка: Complex DataBinding приема като източник на данни или IList, или IListSource. - person Jeffrey; 18.11.2008
comment
Не съм сигурен защо това би се случило... изключението хвърлено ли е от реда DataBind()? - person Charles Bretana; 18.11.2008

Пример за даден обект, наречен 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;
person Aaron Barker    schedule 22.01.2010

Използвайте .tolist. работи и за върнати сложни типове, които получавате от изгледи/съхранени процедури в рамка на обект

person Coder22    schedule 14.09.2010
comment
Това нещо ново ли е в по-късните версии на .net? - person Jeffrey; 14.09.2010

И ако се случи да използвате речника като източник на данни, можете да използвате

MyDDL.Datasouce = myDict.ToList();

и ще го преобразува в тип списък.

person Brady Moritz    schedule 13.05.2010

myCtrl.DataSource = myHashtable
myCtrl.DataBind()

Примерен източник на обвързваем контрол:

<itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
    <%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
person x0n    schedule 18.11.2008