none
Сортировка BindingList RRS feed

  • Вопрос

  • Есть BindingList<cars> carses. При добавлении нового элемента он становится последним в коллекции .

    Это не очень хорошо при использовании BindingList для выпадающего ComboBox.

    Получается, что новый элемент не по алфавиту, а в конце.

    попробовал carses.OrderBy(car => car.type_of_carID); - не сортирует, как бы ничего не меняется.

    Попробовал вот так

    IEnumerable<cars> query = carses.OrderBy(car => car.type_of_carID);

    - тут сортирует, но

    если дальше сделать

    carses  = query as BindingList<cars>; - то сортировка куда-то пропадает, но данные остаются (как-то странно).

    Пока поставил повторный запрос, но это не вариант, лишний раз к базе обращаться.

    carses = ((from z in DataContext.cars orderby z.reg_Number select z) as IListSource).GetList() as BindingList<cars>;

    Может другой метод есть?

    И может кто-нибудь объяснит почему не работает OrderBy. Может я не правильно типы привожу.


    • Изменено serge73 29 мая 2013 г. 17:17

Ответы

  • А как вам такой вариант:

    carses = new BindingList<Cars>(carses.OrderBy(x => x.type_of_carID).ToList());
    Пока писал, уже выше предложили то же самое.
    • Изменено Varlamov Oleg 30 мая 2013 г. 3:48
    • Помечено в качестве ответа serge73 30 мая 2013 г. 4:11

Все ответы

  • Если Вы взгляните на описание этого метода вот тут, прочитайте в заметках, там очень полезная для Вас информация будет

    Данный метод реализуется с использованием отложенного выполнения.Немедленно возвращаемое значение — это объект, в котором хранится вся информация, необходимая для выполнения операции. Запрос, представленный данным методом, не выполняется до тех пор, пока не будет произведено перечисление объекта путем непосредственного вызова его метода GetEnumerator или с помощью оператора foreach в Visual C# либо For Each в Visual Basic.

    Выходит, что в результате carses.OrderBy(car => car.type_of_carID) выходной объект не отсортированный. Он стает отсортированным если вызвать метод GetEnumerator соответсвенно Вы получите отсортированное перечисление






    • Изменено Higgs.Boson 29 мая 2013 г. 18:13
  • Попробовал

               carses.OrderBy(car => car.type_of_carID);            carses.GetEnumerator();

    и

               carses.OrderBy(car => car.type_of_carID).GetEnumerator();

    Результата нет, не сортирует. Ничего не происходит. Все как и было.

    Мне кажется я явно не так пишу. Если не сложно напишите строчку, как должно быть.

  • using System;
    using System.ComponentModel;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class cars
        {
            public int type_of_carID;
            public string name;
        }
        class Program
        {
            static void Main()
            {
                BindingList<cars> carses = new BindingList<cars>();
                carses.Add(new cars { type_of_carID=2,name="BMW"});
                carses.Add(new cars { type_of_carID = 1, name = "Toyota" });
                carses.Add(new cars { type_of_carID = 3, name = "Honda" });
                var e = carses.OrderBy(car => car.type_of_carID);
                foreach(cars c in carses)
                {
                    Console.WriteLine(c.type_of_carID);
                }
                foreach(cars c in e)
                {
                    Console.WriteLine(c.type_of_carID);
                }
                var e1 = (carses.OrderBy(car => car.type_of_carID)).ToList();//e1-отсортирован
                foreach (cars c in e1)
                {
                    Console.WriteLine(c.type_of_carID);
                }
                Console.ReadKey();
            }
        }
    }





    • Изменено Higgs.Boson 29 мая 2013 г. 18:56
  • Как я уже писал в первом посте

    IEnumerable<cars> query = carses.OrderBy(car => car.type_of_carID);

    дает замечательный результат для query (в вашем случае это List<cars> e и List<cars> e1)

    но мне нужно получить именно BindingList<cars> carses, отсортированный заново.

    carses  = query as BindingList<cars>; - сортировка куда-то пропадает,  данные остаются неизменными.

  • Тогда, попробуйте создать новый объект из уже отсортированного e1

    Используется при этом конструктор 

    public BindingList(IList<T> list)

  • А как вам такой вариант:

    carses = new BindingList<Cars>(carses.OrderBy(x => x.type_of_carID).ToList());
    Пока писал, уже выше предложили то же самое.
    • Изменено Varlamov Oleg 30 мая 2013 г. 3:48
    • Помечено в качестве ответа serge73 30 мая 2013 г. 4:11
  • Спасибо, Олег. Все заработало. Конкретно и понятно.

    Но осадок остался :).

    Почему напрямую не может преобразовать List в BindingList, а новый BindingList из List- пожалуйста?


  • Почему напрямую не может преобразовать List в BindingList, а новый BindingList из List- пожалуйста?

    Ну как минимум потому, что эти классы не связаны отношением родитель-потомок и в них не переопределены операции приведения этих типов друг к другу. Но только у BindingList(как и у List, собственно) есть конструктор, который принимает IList<T> в качестве параметра. Аналогично можно получить новый List из BindingList.