[ Pharos @ 06.06.2008. 15:04 ] @
Potrebno mi je da na datagridview bindujem IList<T> i imam mogućnost sortiranja kada kliknem na header.
Pogledao sam nešto slično na http://www.timvw.be/presenting-the-sortablebindinglistt/ ali ta klasa radi samo sa List kolekcijom i sortiranje ne radi kako treba.
[ deerbeer @ 06.06.2008. 15:53 ] @
Probaj odavde :
http://dotnetslackers.com/comm...generic-List_3C00_T_3E00_.aspx
[ Pharos @ 09.06.2008. 08:19 ] @
Nije mnogo pomoglo...
[ logic_rabbit @ 09.06.2008. 08:51 ] @
Rijesenje ti je na onom tvom prvom linku.
Kreiraj svoju klasu, nazovi je SortabilnaLista npr.
implementiraj IList ako hoces ili nasljedi neku listu.
Odradi override kao i ovaj covjek u primjeru i napravi sve isto kao on...
I nakraju ako ti treba interfejs napravi interfejs svoje klase
i nazovi ga ISortabilnaLista.

Meni je ovaj isti kod radio...
[ deerbeer @ 09.06.2008. 09:12 ] @
Citat:
Pharos: Nije mnogo pomoglo...

Razlog ???

Napravis jednu sortabilnu klasu sa static metodama od kojih ce svaka raditi sort za odredjenu kolonu ..

Code:

public class ProductSorting : IComparable<Product>
{     

 public static Comparison<Product> PriceComparison =      
  delegate(Product p1, Product p2) 
       {            return p1.Price.CompareTo(p2.Price);       
 };    

public static Comparison<Product> IDComparison =        
delegate(Product p1, Product p2)   
{  
 return p1.ProductID.CompareTo(p2.ProductID);    
   
};  

public int CompareTo(Product other)   
{        
return ProductName.CompareTo(other.ProductName);  

}


}
//negde u kodu 

List<Product> items = new List<Product>() ; 
items.Add(...) ; 
..
..
items.Sort(ProductSorting.IDComparison) ;
items.Sort(ProductSorting.PriceComparison ) ;

[ mmix @ 09.06.2008. 10:18 ] @
Milim da znam zasto mu to ne pomaze, on ne radi sa svojim List<T> instancama, radi sa IList<T> interfejsom (mozda ga je dobio iz nekog business layer-a). A IList<T> nema sort.

Resenje je medjutim veoma jednostavno, nema potrebe da se kreiraju posebne klase, samo se iz IList<T> napravi List<T> kroz ToList() metod. Onda na toj listi moze da se radi sortiranje kao sto ste predlozili. A moze i ad izvuce IEnumerable<T> iz IList<T> i da nad njim pozove OrderBy(labda) metod da dobije sortirani IEnumerable, bez ikakvih IComparable<T> klasa.
[ mmix @ 09.06.2008. 12:51 ] @
Evo ti dva primera sortiranja IList<T>:

Code:

    class Person
    {
        public int ID; public string ime;
    }

    class Program
    {
        static void Main(string[] args)
        {
            IList<Person> ilista = new List<Person>() { new Person() { ID = 12, ime = "Pera"},
                                                        new Person() { ID = 1, ime = "Zika"},
                                                        new Person() { ID = 7, ime = "Aska"}};

            string imePolja = "ID";
            FieldInfo field = ilista.GetType().GetGenericArguments()[0].GetField(imePolja);
            var sortedlista = (from p in ilista
                               orderby field.GetValue(p)
                               select p).ToList();

            var sortedlista2 = ilista.AsEnumerable().OrderBy(x => x.ime).ToList();
        }
    }


Oba u principu koriste IEnumerable<T>.OrderBy() za sortiranje, samo sto sortedlista koristi kroz LINQ to Objects, a sortedlista2 kroz direktan poziv ekstenzije. Takodje, sortedlista moze da se koristi univerzalno posto koristi refleksiju (imePolja moze da ti bude ime polje na koje je korisnik kliknuo u headeru tako da ne moras da imas poseban kod za svako posebno polje, sto je slucaj sa sortedlista2. Cena univerzalnosti je sto moras kroz refleksiju, i sto za property moras da koristis PropertyInfo umesto FieldInfo.