Domanda

In vb.net / winforms, come può una tabella hash essere associata a un elenco a discesa oa qualsiasi altro controllo basato sull'origine dati?

È stato utile?

Soluzione

È questo winforms, wpf o asp.net? [update: ahh ... winforms ;-p]

winforms vuole che i dati siano IList (o, indirettamente, via IListSource) - quindi suppongo (dal commento) che tu stia usando winforms. Nessuna delle raccolte integrate simili a dizionari implementa List<T>, ma a dire il vero non importa: se si è vincolanti i dati, il volume è probabilmente abbastanza piccolo, quindi un elenco regolare dovrebbe andare bene.

L'opzione migliore è qualcosa di simile a BindingList<T> o T, dove HashTable ha tutte le proprietà a cui si desidera associare. È un'opzione? Se sei bloccato con 1.1 (dato che menzioni Dictionary<,> anziché ArrayList), usa <=>.

Esempio (in 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}});
}

Altri suggerimenti

Usa semplicemente la proprietà Origine dati degli elenchi a discesa

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

Esempio per un determinato oggetto chiamato Ordine:

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";

La cosa interessante di questo è che puoi quindi recuperare i dati dall'elenco come oggetto originale (non solo il campo valore come in asp.net).

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

Usa .tolist. funziona anche per i tipi complessi restituiti ottenuti da viste / stored procedure nel framework di entità

E, se ti capita di usare Dizionario come origine dati, puoi usare

MyDDL.Datasouce = myDict.ToList();

e lo convertirà in un tipo di elenco.

myCtrl.DataSource = myHashtable
myCtrl.DataBind()

Fonte di esempio di controllo associabile:

<itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
    <%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top