Pergunta

em VB.NET / winforms, como pode um hashtable ser vinculado a uma lista suspensa ou qualquer outro controle orientado a fonte de dados?

Foi útil?

Solução

É este winforms, WPF, ou asp.net? [Update: ahh ... winforms ;-p]

winforms quer os dados sejam IList (ou, indiretamente, através IListSource) - então eu estou supondo (a partir da observação) que você está usando winforms. Nenhum dos embutido dicionário-como coleções implementar IList, mas para ser honesto, não importa:. Se você estiver de ligação de dados, o volume é provavelmente bastante pequenos, então uma lista regular deve ser fino

A melhor opção é algo como um List<T> ou BindingList<T>, onde T tem todas as propriedades que você deseja ligar. É este uma opção? Se você está preso com 1,1 (uma vez que você menciona HashTable em vez de Dictionary<,>), então use ArrayList.

Exemplo (em 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}});
}

Outras dicas

Basta usar das listas suspensas Datasource propriedade

   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();

Exemplo para um dado objeto chamado 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";

legal da E sobre isso é que você pode, então, voltar os dados fora da lista como o objeto original (não apenas o campo de valor como em asp.net).

Order order = (Order)this.comboBox_Orders.SelectedValue;

Use .ToList. ele também funciona para tipos complexos devolvidos você começa a partir views / procedimentos armazenados na estrutura de entidade

E, se acontecer de você usar dicionário como a fonte de dados, você pode usar

MyDDL.Datasouce = myDict.ToList();

e vai convertê-lo para um tipo de lista.

myCtrl.DataSource = myHashtable
myCtrl.DataBind()

Exemplo fonte de controle ligável:

<itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
    <%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top