【问题标题】:How can a hashtable be bound to a drop down list?哈希表如何绑定到下拉列表?
【发布时间】:2010-09-22 20:55:30
【问题描述】:

在 vb.net/winforms 中,如何将哈希表绑定到下拉列表或任何其他数据源驱动的控件?

【问题讨论】:

  • 如果有什么不同的话,我真的在使用 System.Windows.Forms.Combobox,带有 DropDownList 下拉样式。

标签: .net vb.net data-binding drop-down-menu hashtable


【解决方案1】:

只需使用下拉列表的 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();

【讨论】:

  • 无论出于何种原因,这都会给我这个错误:“复杂的 DataBinding 接受 IList 或 IListSource 作为数据源。”
  • 我不知道为什么会发生这种情况。是 DataBind() 行抛出的异常吗?
【解决方案2】:

这是 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}});
}

【讨论】:

  • 你说得对——这是一个winforms项目。我没有意识到会有这样的差异。非常感谢。
【解决方案3】:

名为 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;

【讨论】:

    【解决方案4】:

    使用 .tolist。它也适用于您从实体框架中的视图/存储过程中获得的返回复杂类型

    【讨论】:

    • 这是 .net 更高版本中的新功能吗?
    【解决方案5】:

    而且,如果你碰巧使用 Dictionary 作为数据源,你可以使用

    MyDDL.Datasouce = myDict.ToList();
    

    它会将其转换为列表类型。

    【讨论】:

      【解决方案6】:
      myCtrl.DataSource = myHashtable
      myCtrl.DataBind()
      

      可绑定控件的示例来源:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2021-02-25
        • 2012-01-25
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多