web-dev-qa-db-ja.com

辞書をリピーターにバインド

辞書オブジェクト<string, string>をリピーターにバインドしたいと考えています。ただし、実際にキーと値のペアを表示するためにaspxマークアップに何を配置するかわかりません。スローされるエラーはなく、Listで動作させることができます。辞書をリピーターに表示するにはどうすればよいですか?

40
XSL

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") %>
46
Joe

<%# Eval("key")%>がうまくいきました。

32
Arun Krish

辞書の値コレクションにバインドします。

myRepeater.DataSource = myDictionary.Values
myRepeater.DataBind()
11
Jason Berkan

バインドされた辞書のエントリのタイプのコードビハインドにプロパティを記述します。たとえば、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.KeyPersonであり、Item.Valueintであり、それらは強く-そのようにタイプ。

もちろん、(読み取り:should)、Itemを辞書内のエントリのより象徴的な名前に変更できます。それだけでも、私の使用例での命名のあいまいさを減らすのに役立ちます。

次のように、追加のプロパティを定義することを妨げるものは確かにありません。

protected Person CurrentPerson
{
    get { return ((KeyValuePair<Person, int>)this.GetDataItem()).Key; }
}

そして、それをあなたのマークアップで使用する:

<span><%# this.CurrentPerson.FirstName %></span>

...どれも、対応する辞書エントリの.Valueへのアクセスを妨げません。

2
JMD