辞書オブジェクト<string, string>
をリピーターにバインドしたいと考えています。ただし、実際にキーと値のペアを表示するためにaspx
マークアップに何を配置するかわかりません。スローされるエラーはなく、List
で動作させることができます。辞書をリピーターに表示するにはどうすればよいですか?
IDictionary<TKey,TValue>
はICollection<KeyValuePair<TKey, TValue>>
でもあります。
あなたは(テストされていない)のようなものにバインドする必要があります:
((KeyValuePair<string,string>)Container.DataItem).Key
((KeyValuePair<string,string>)Container.DataItem).Value
アイテムが返される順序は定義されていないことに注意してください。小さな辞書の挿入順で返される可能性がありますが、これは保証されていません。保証された順序が必要な場合、SortedDictionary<TKey, TValue>
はキーでソートします。
または、別の並べ替え順序が必要な場合(値順など)、Key-ValueペアのList<KeyValuePair<string,string>>
を作成してから並べ替え、並べ替えられたリストにバインドすることもできます。
Answer:このコードをマークアップで使用して、キーと値を個別に表示しました。
<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Key") %>
<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Value") %>
<%# Eval("key")%>
がうまくいきました。
辞書の値コレクションにバインドします。
myRepeater.DataSource = myDictionary.Values
myRepeater.DataBind()
バインドされた辞書のエントリのタイプのコードビハインドにプロパティを記述します。たとえば、Dictionary<Person, int>
をリピーターにバインドするとします。私はコードビハインドに次のようなプロパティを(C#で)書き込みます。
protected KeyValuePair<Person, int> Item
{
get { return (KeyValuePair<Person, int>)this.GetDataItem(); }
}
次に、私の見解では、次のようなコードセグメントを使用できます。
<span><%# this.Item.Key.FirstName %></span>
<span><%# this.Item.Key.LastName %></span>
<span><%# this.Item.Value %></span>
これにより、マークアップがよりクリーンになります。そして、私は参照されている値に対してより一般的でない名前を好むが、Item.Key
はPerson
であり、Item.Value
はint
であり、それらは強く-そのようにタイプ。
もちろん、(読み取り:should)、Item
を辞書内のエントリのより象徴的な名前に変更できます。それだけでも、私の使用例での命名のあいまいさを減らすのに役立ちます。
次のように、追加のプロパティを定義することを妨げるものは確かにありません。
protected Person CurrentPerson
{
get { return ((KeyValuePair<Person, int>)this.GetDataItem()).Key; }
}
そして、それをあなたのマークアップで使用する:
<span><%# this.CurrentPerson.FirstName %></span>
...どれも、対応する辞書エントリの.Value
へのアクセスを妨げません。