vb.net / winformsで、ハッシュテーブルをドロップダウンリストまたはその他のデータソース駆動型コントロールにバインドするにはどうすればよいですか?
6 に答える
Just use the dropdown lists's Datasource property
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();
これは 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}});
}
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;
.tolistを使用します。また、エンティティフレームワークのビュー/ストアドプロシージャから取得する返された複合型に対しても機能します
myCtrl.DataSource = myHashtable
myCtrl.DataBind()
Example source of bindable control:
<itemtemplate>
<%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
<%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
また、辞書をデータソースとして使用する場合は、次を使用できます
MyDDL.Datasouce = myDict.ToList();
そしてそれをリスト型に変換します。