Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Repeater Сортировка


Автор: Ronin08 12.4.2009, 16:09
Доброго времени суток!
Как можно организовать сортировку записей(убывание/возрастание)  по кликанью на заголовке поля в репитере?
К репитеру я биндю список экземпляров класса.

Автор: 1stain 12.4.2009, 20:08
При наличии достаточного количества свободного времени можно сделать что угодно, даже сортируемый репитер
Код

<asp:Repeater ID="Repeater1" runat="server" >
    <HeaderTemplate>
        <table border="1" width="500px" >
            <tr>
                <td>
                    <asp:LinkButton runat="server" ID="HeaderFirstNameLinkButton" CommandArgument="FirstName"
                        Text="First Name" OnClick="Repeater1_OnSorting" />
                </td>
                <td>
                    <asp:LinkButton runat="server" ID="HeaderLastNameLinkButton" CommandArgument="LastName"
                        Text="First Name" OnClick="Repeater1_OnSorting" />
                </td>
            </tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr style="background-color:White;" >
            <td><%# Eval("FirstName") %></td>
            <td><%# Eval("LastName") %></td>
        </tr>
    </ItemTemplate>
    <AlternatingItemTemplate>
        <tr style="background-color:Silver;" >
            <td><%# Eval("FirstName") %></td>
            <td><%# Eval("LastName") %></td>
        </tr>
    </AlternatingItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>


Код

public partial class WebForm1 : System.Web.UI.Page
{
    private List<Customer> CustomersDataSource
    {
        get
        {
            return Session["CustomersDataSource"] as List<Customer>;
        }
        set
        {
            Session["CustomersDataSource"] = value;
        }
    }

    private SortDirection CurrentSortDirection
    {
        get
        {
            return (SortDirection)(ViewState["CurrentSortDirection"] ?? SortDirection.Ascending);
        }
        set
        {
            ViewState["CurrentSortDirection"] = value;
        }
    }
   
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            CustomersDataSource = new List<Customer>{
                new Customer{
                    FirstName = "First",
                    LastName = "Первый нах"
                },
                new Customer{
                    FirstName = "Second",
                    LastName = "Второй и ниипет"
                },
                new Customer{
                    FirstName = "Third",
                    LastName = "Замыкаю пидистал"
                }
            };

            Repeater1.DataSource = CustomersDataSource;
            Repeater1.DataBind();
        }
    }

    protected void Repeater1_OnSorting(object sender, EventArgs e)
    {
        LinkButton buttonClicked = sender as LinkButton;
        switch (buttonClicked.CommandArgument)
        {
            case "FirstName":
                if (CurrentSortDirection == SortDirection.Ascending)
                {
                    CustomersDataSource.Sort(Customer.FirstNameComparisonAscending);
                }
                else
                {
                    CustomersDataSource.Sort(Customer.FirstNameComparisonDescending);
                }
                break;
            case "LastName":
                if (CurrentSortDirection == SortDirection.Ascending)
                {
                    CustomersDataSource.Sort(Customer.LastNameComparisonAscending);
                }
                else
                {
                    CustomersDataSource.Sort(Customer.LastNameComparisonDescending);
                }
                break;
            default:
                return;
        }
        CurrentSortDirection = CurrentSortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
        Repeater1.DataSource = CustomersDataSource;
        Repeater1.DataBind();
    }
}

public sealed class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    
    public static Comparison<Customer> FirstNameComparisonAscending = (x, y) => Comparer<string>.Default.Compare(x.FirstName, y.FirstName);
    public static Comparison<Customer> FirstNameComparisonDescending = (x, y) => Comparer<string>.Default.Compare(y.FirstName, x.FirstName);
    public static Comparison<Customer> LastNameComparisonAscending = (x, y) => Comparer<string>.Default.Compare(x.LastName, y.LastName);
    public static Comparison<Customer> LastNameComparisonDescending = (x, y) => Comparer<string>.Default.Compare(y.LastName, x.LastName);
}

public enum SortingDirection
{
    Ascending = 1,
    Descending = 2
}


На самом деле этот код не представляет практической ценности ввиду наличия такого контрола, как ListView, в котором сортировка уже существует
http://weblogs.asp.net/scottgu/archive/2007/08/10/the-asp-listview-control-part-1-building-a-product-listing-page-with-clean-css-ui.aspx http://msdn.microsoft.com/en-us/library/bb398790.aspx#SortingDataDisplayedByTheListViewControl

Автор: Ronin08 12.4.2009, 23:15
Цитата(1stain @  12.4.2009,  20:08 Найти цитируемый пост)
На самом деле этот код не представляет практической ценности ввиду наличия такого контрола, как ListView, в котором сортировка уже существует

Мне нужно реализовать сортировку именно в репитере

Код

public static Comparison<Customer> FirstNameComparisonAscending = (x, y) => Comparer<string>.Default.Compare(x.FirstName, y.FirstName);
public static Comparison<Customer> FirstNameComparisonDescending = (x, y) => Comparer<string>.Default.Compare(y.FirstName, x.FirstName);
public static Comparison<Customer> LastNameComparisonAscending = (x, y) => Comparer<string>.Default.Compare(x.LastName, y.LastName);
public static Comparison<Customer> LastNameComparisonDescending = (x, y) => Comparer<string>.Default.Compare(y.LastName, x.LastName);


Не совсем понятна эта запись, вернее синтаксис. Смысл то ясен. В студии куча ошибок вылетает в этих строках

Автор: 1stain 12.4.2009, 23:25
Цитата(Ronin08 @  12.4.2009,  23:15 Найти цитируемый пост)
Не совсем понятна эта запись, вернее синтаксис.

Лямбда-выражения. Если у тебя 2005 студия - переделай на анонимные методы.

Автор: Ronin08 13.4.2009, 10:00
Цитата(1stain @  12.4.2009,  23:25 Найти цитируемый пост)
Лямбда-выражения. Если у тебя 2005 студия - переделай на анонимные методы

То как я думал не получается, подробнее можно

Автор: 1stain 13.4.2009, 22:29
поподробнее в МСДН: http://msdn.microsoft.com/ru-ru/library/0yw3tz5k.aspx
Код

    public static Comparison<Customer> FirstNameComparisonAscending = 
        delegate(Customer x, Customer y) { return Comparer<string>.Default.Compare(x.FirstName, y.FirstName); };
    public static Comparison<Customer> FirstNameComparisonDescending = 
        delegate(Customer x, Customer y) { return Comparer<string>.Default.Compare(y.FirstName, x.FirstName); };
    public static Comparison<Customer> LastNameComparisonAscending = 
        delegate(Customer x, Customer y) { return Comparer<string>.Default.Compare(x.LastName, y.LastName); };
    public static Comparison<Customer> LastNameComparisonDescending = 
        delegate(Customer x, Customer y) { return Comparer<string>.Default.Compare(y.LastName, x.LastName); };


з.ы. ты что, реферат по истории развития .NET пишешь? (период 2-го фреймверка)  smile 

Автор: Ronin08 14.4.2009, 15:05
1stain,  спасибо, немного подпилил и заработало!
держи"+"
кстати, как можно сделать, чтобы отображалась еще и стрелка, показывающая направление сортировки?

Автор: 1stain 15.4.2009, 11:47
Цитата(Ronin08 @  14.4.2009,  15:05 Найти цитируемый пост)
как можно сделать, чтобы отображалась еще и стрелка, показывающая направление сортировки?

Код

<HeaderTemplate>
    <table border="1" width="500px" >
        <tr>
            <td>
                <asp:LinkButton runat="server" ID="HeaderFirstNameLinkButton" CommandArgument="FirstName"
                    Text="First Name" OnClick="Repeater1_OnSorting" >
                    <asp:Image runat="server" ID="FirstName_SortDirectionImage" Visible="false" />
                </asp:LinkButton>
            </td>
            <td>
                <asp:LinkButton runat="server" ID="HeaderLastNameLinkButton" CommandArgument="LastName"
                    Text="First Name" OnClick="Repeater1_OnSorting" >
                    <asp:Image runat="server" ID="LastName_SortDirectionImage" Visible="false" />
                </asp:LinkButton>
            </td>
        </tr>
</HeaderTemplate>


Код

// ...
    private string FieldSorted
    {
        get
        {
            return ViewState["Repeater1_FieldSorted"] as string;
        }
        set
        {
            ViewState["Repeater1_FieldSorted"] = value;
        }
    }
//...
    protected void Repeater1_OnSorting(object sender, EventArgs e)
    {
        LinkButton buttonClicked = sender as LinkButton;

        switch (buttonClicked.CommandArgument)
        {
            case "FirstName":
                if (CurrentSortDirection == SortDirection.Ascending)
                {
                    CustomersDataSource.Sort(Customer.FirstNameComparisonAscending);
                }
                else
                {
                    CustomersDataSource.Sort(Customer.FirstNameComparisonDescending);
                }
                FieldSorted = "FirstName";
                break;
            case "LastName":
                if (CurrentSortDirection == SortDirection.Ascending)
                {
                    CustomersDataSource.Sort(Customer.LastNameComparisonAscending);
                }
                else
                {
                    CustomersDataSource.Sort(Customer.LastNameComparisonDescending);
                }
                FieldSorted = "LastName";
                break;
            default:
                return;
        }

        CurrentSortDirection = CurrentSortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
        Repeater1.DataSource = CustomersDataSource;
        Repeater1.DataBind();
    }
//...
    protected void Page_PreRender(object sender, EventArgs e)
    {
        Image sortingDirectionImage = FindControl(Repeater1, string.Format("{0}_SortDirectionImage", FieldSorted)) as Image;
        if (sortingDirectionImage != null)
        {
            sortingDirectionImage.Visible = true;
            sortingDirectionImage.ImageUrl = CurrentSortDirection == SortDirection.Ascending ? "~/Images/sort-desc.gif" : "~/Images/sort-asc.gif";
        }
    }

    private Control FindControl(Control container, string id)
    {
        Control f = container.FindControl(id);
        if (f != null)
            return f;
        foreach (Control c in container.Controls)
        {
            f = FindControl(c, id);
            if (f != null)
                return f;
        }
        return null;
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)