3

ここに画像の説明を入力

名前のリストを表示するために asp リピーターを使用しています。インデックス ページのように、現在の文字をグループ ヘッダーのタイプとして表示したいと考えています。

データはバインド前にアルファベット順にソートされますが、名前が表示される前に「A」と「B」を挿入するのが難しいと感じています。

4

5 に答える 5

2

バインドする前にソートします。

つまり、ソートされた結果セットをバインドします。

ただし、値を確認しないと、その方法を正確に判断することはできません。


更新 - あなたのコメントから、バインディング ソースを次のように変更する必要があると思いますDictionary<string,IList<string>>

このような構造を使用すると、キー (ソート) とサブリスト (2 次ソート) でバインドできます。

于 2013-02-12T14:04:48.740 に答える
1

ネストされたリピーター (リピーター内のリピーター) を使用できます。カテゴリとサブカテゴリのように。最初のリピーターでは、すべての名前をリストし、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>

于 2013-02-12T14:14:52.307 に答える
1

データをリピーターにバインドする前に、データを並べ替える必要があります。

于 2013-02-12T14:05:42.390 に答える
1

正直なところ、これを行うのはあまり良い方法ではありません。リピーターは通常、私が見つけた醜いコードになります。設定できるのであれば、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; }
        }
}
于 2013-02-12T17:38:08.817 に答える