Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Repeater Сортировка 
:(
    Опции темы
Ronin08
Дата 12.4.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Доброго времени суток!
Как можно организовать сортировку записей(убывание/возрастание)  по кликанью на заголовке поля в репитере?
К репитеру я биндю список экземпляров класса.
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
1stain
Дата 12.4.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 11
Всего: 40



При наличии достаточного количества свободного времени можно сделать что угодно, даже сортируемый репитер
Код

<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, в котором сортировка уже существует
про ListView смотри здесь и здесь



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Ronin08
Дата 12.4.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Цитата(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);


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


Это сообщение отредактировал(а) Ronin08 - 12.4.2009, 23:16
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
1stain
Дата 12.4.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 11
Всего: 40



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

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


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Ronin08
Дата 13.4.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



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

То как я думал не получается, подробнее можно
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
1stain
Дата 13.4.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 11
Всего: 40



поподробнее в МСДН: анонимные методы
Код

    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 



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Ronin08
Дата 14.4.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



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

--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
1stain
Дата 15.4.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 11
Всего: 40



Цитата(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;
    }
}


Это сообщение отредактировал(а) 1stain - 15.4.2009, 11:53


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.