データバインドされたasp:repeaterコントロールのフィールドの変更時にサブヘッダー行を表示する方法はありますか?
それ以外の
国 | 色 | 番号 イギリス | 赤 | 赤 | 3 イギリス | 緑 | 3 フランス | フランス | 赤 3
これを行う:
==イギリス== 色 | 番号 赤 | 赤 | 3 緑 3 ==フランス== 色 | 番号 赤 | 赤 | 3
助けてくれてありがとう。
データバインドされたasp:repeaterコントロールのフィールドの変更時にサブヘッダー行を表示する方法はありますか?
それ以外の
国 | 色 | 番号 イギリス | 赤 | 赤 | 3 イギリス | 緑 | 3 フランス | フランス | 赤 3
これを行う:
==イギリス== 色 | 番号 赤 | 赤 | 3 緑 3 ==フランス== 色 | 番号 赤 | 赤 | 3
助けてくれてありがとう。
組み込みのサポートはありませんが、それが不可能というわけではありません。
OnItemDataBound イベントをオーバーライドし、マークアップに次のようなものを含める必要があります。
<asp:Repeater OnItemDataBound="NextItem" ... >
<ItemTemplate><asp:Literal Id="Header" Visible="False" Text="{0}<strong>{1}</strong><br/><table>" ... />
<tr>
<td><asp:Label id="Color" Text="<%# Eval("Color")" ... /></td>
<td><asp:Label id="Number" Text="<%# Eval("Number")" ... /></td>
</tr>
</ItemTemplate>
</asp:Repeater></table>
次に、コード ビハインドで:
private string CurCountry = string.Empty;
private void NextItem(object sender, RepeaterItemEventARgs e)
{
if ( e.Item.ItemType != ListItemType.Item
&& e.Item.ItemType != ListItemType.AlternatingItem) return;
DbDataRecord row = (DbDataRecord)e.Item.DataItem;
if (CurCountry != row["country"].ToString() )
{
string prev = (CurCounter == string.Empty)?"":"</table>";
CurCountry = row["country"].ToString();
Literal header = (Literal)e.Item.FindControl("Header");
Literal footer = (Literal)e.Item.FindControl("Footer");
header.Text = string.Format(header.Text, prev, CurCountry);
header.Visible = true;
}
}
もう 1 つの解決策は、単純に 2 つのリピータを使用して、一方を他方の中に入れ子にすることです。子レコードを含むグループを最初のリピーターに渡し、グループ リピーターの ItemDataBound で、子レコードを子リピーターに渡し、そこで DataBind() を呼び出します。
これはより多くのコードですが、コード ビハインドに HTML 作成コードを含めなくても、実際にはレイアウトをより詳細に制御できます。
ここでわかるように、親リピーターがあり、項目テンプレートで各グループを適切にカスタマイズできます。ChildRepeater には、グループ内の各アイテムをカスタマイズできるアイテム テンプレートがあります。非常にクリーンで、すべて宣言型 UI を備えています。
<asp:Repeater runat="server" id="GroupRepeater">
<ItemTemplate>
<asp:Literal runat="server" id="HeaderText" />
<asp:Repeater runat="server id="ChildRepeater">
<ItemTemplate>
<asp:Literal runat="server" id="InfoGoesHere" />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
コードビハインドでは、次のようなものを使用できます。
private void GroupRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//Get the child records, this can be any data structure you want
SomeChildCollection children = ((SomeGroupCollection)e.Item.DataItem).Children;
//Find the child repeater
Repeater childRepeater = e.Item.FindControl("ChildRepeater") as Repeater;
childRepeater.ItemDataBound += SomeMethod;
childRepeater.DataSource = children;
childRepeater.DataBind();
}
各子をバインドした後、ItemDataBound イベントをサブスクライブし、必要に応じて子をコントロールにバインドできます。
dotnetjunkies コードにはいくつかのバグがあるようですが、ここでもっと簡単な解決策を見つけましたhttp://www.west-wind.com/weblog/posts/140753.aspx
現在、リピーターはグループ化をサポートしていないため、自分でこれを行う必要がありますが、それは非常に簡単です. 上記のリピーターでは、次のデータ式がグループ化を担当しています。
<%# this.RenderGroup(Eval("Group") as
string) %>
この式は、フォームのメソッドを呼び出して、追加の div タグをレンダリングします。この単純なメソッドのコードは次のようになります。
string LastGroup = "@#@~";
protected string RenderGroup(string Group) {
if (Group == this.LastGroup)
return ""; // *** Group has changed
this.LastGroup = Group;
return "<div class='groupheader'>" +Group + "</div>";
}
このコードはすべてのアイテムに対して呼び出され、グループが変更されたかどうかを確認するだけです。何も返されない場合は、単純な div タグが文字列として返され、マークアップに埋め込まれます。私は HTML を送り返すことにしましたが、true または false を返し、リピーターで条件付きでコントロールをレンダリングすることもできると思います。
ソリューションをジョエルするには、次のようにアドバイスする場合があります-この行を変更します。
header.Text = string.Format("<strong> {0} </strong><br/><table>", CurCountry);
に
header.Text = string.Format(header.Text, CurCountry);
さらに、.as?x ファイルからルック アンド フィールをカスタマイズできます。
ああ、あなたはグループ化のリピーターを求めています。私が過去に採用した解決策は消えてしまったようです。多分あなたはそれを見つけることができます。とにかく、リピーターのグループ化を検索すると役立つはずです。