名前のリストを表示するために asp リピーターを使用しています。インデックス ページのように、現在の文字をグループ ヘッダーのタイプとして表示したいと考えています。
データはバインド前にアルファベット順にソートされますが、名前が表示される前に「A」と「B」を挿入するのが難しいと感じています。
バインドする前にソートします。
つまり、ソートされた結果セットをバインドします。
ただし、値を確認しないと、その方法を正確に判断することはできません。
更新 - あなたのコメントから、バインディング ソースを次のように変更する必要があると思いますDictionary<string,IList<string>>
。
このような構造を使用すると、キー (ソート) とサブリスト (2 次ソート) でバインドできます。
ネストされたリピーター (リピーター内のリピーター) を使用できます。カテゴリとサブカテゴリのように。最初のリピーターでは、すべての名前をリストし、A で始まる条件を作成できます。次に、サブ リピーターですべての名前を表示できます。また、itemdatabound イベントを使用して 2 番目のリピーターをバインドします。
<asp:Repeater id="rptFirstLetters" runat="server" OnItemDataBound="rptChars_OnItemDataBound">
<ItemTemplate>
<div>"<%#Eval("letters") %>"
<asp:Repeater id="rptNames" runat="server">
<ItemTemplate>
<%#Eval("names") %>
</ItemTemplate>
</asp:Repeater>
</div> // bind all letters
</ItemTemplate>
データをリピーターにバインドする前に、データを並べ替える必要があります。
正直なところ、これを行うのはあまり良い方法ではありません。リピーターは通常、私が見つけた醜いコードになります。設定できるのであれば、kad1r の階層的アプローチがおそらく最も優れていますが、実装の詳細に応じて代替手段があります。マークアップを非常にきれいに保ち、プログラマーではない設計担当者がいることは私にとってプラスであるため、私はいくつかの点でこれを好みます。
ASPX:
<%@ Page language="C#" Src="test.CODE.cs" Inherits="test_Page" %>
<asp:Repeater ID="TestRepeater" runat="server">
<ItemTemplate>
<asp:PlaceHolder Visible='<%# Eval("IsFirstInGroup") %>' runat="server">
<strong><%# Eval("Initial") %></strong><br/>
</asp:PlaceHolder>
<%# Eval("Name") %><br/>
</ItemTemplate>
</asp:Repeater>
コードビハインド:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public class test_Page : Page
{
protected Repeater TestRepeater;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
String[] names = new String[]
{
"Alpha, John",
"Altman, Mary",
"Asher, Cyril",
"Bachman, Turner",
"Beta, Rob",
"Bexman, Norah",
"Clark, Freddy"
};
List<_DispItem> l = new List<_DispItem>();
for (int i = 0; i < names.Length; i++)
l.Add(new _DispItem() { Name = names[i], IsFirstInGroup = (i == 0 || names[i - 1][0] != names[i][0]) });
TestRepeater.DataSource = l;
TestRepeater.DataBind();
}
private class _DispItem
{
public String Name { get; set; }
public String Initial { get { return Name.Substring(0, 1); } }
public bool IsFirstInGroup { get; set; }
}
}