Pregunta

En vb.net / winforms, ¿cómo se puede vincular una tabla hash a una lista desplegable o cualquier otro control controlado por fuente de datos?

¿Fue útil?

Solución

¿Es esto winforms, wpf o asp.net? [actualización: ahh ... winforms ;-p]

winforms quiere que los datos sean IList (o, indirectamente, a través de IListSource), así que supongo (por el comentario) que está utilizando winforms. Ninguna de las colecciones incorporadas tipo diccionario implementan List<T>, pero para ser honesto, no importa: si usted es un enlace de datos, el volumen probablemente sea bastante pequeño, por lo que una lista regular debería estar bien.

La mejor opción es algo así como un BindingList<T> o T, donde HashTable tiene todas las propiedades que desea vincular. ¿Es esta una opción? Si está atascado con 1.1 (ya que menciona Dictionary<,> en lugar de ArrayList), use <=>.

Ejemplo (en 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}});
}

Otros consejos

Simplemente use la propiedad Datasource de las listas desplegables

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

Ejemplo para un objeto dado llamado Orden:

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

Lo bueno de esto es que puede recuperar los datos de la lista como el objeto original (no solo el campo de valor como en asp.net).

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

Utilice .tolist. también funciona para los tipos complejos devueltos que obtiene de vistas / procedimientos almacenados en el marco de la entidad

Y, si utiliza el Diccionario como fuente de datos, puede usar

MyDDL.Datasouce = myDict.ToList();

y lo convertirá a un tipo de lista.

myCtrl.DataSource = myHashtable
myCtrl.DataBind()

Fuente de ejemplo de control enlazable:

<itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
    <%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top