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

В 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.

Пример (на С#):

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

И, если вам случится использовать Dictionary в качестве источника данных, вы можете использовать

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