2016-09-26 3 views
1

나는 수천 개의 MyClass 개체가 BindingList<MyClass>에 저장되어 있습니다. 날짜 속성 MyClass.dt별로 정렬하고 싶습니다.바인딩 목록을 정렬하는 방법 <T>?

클래스 BindingList는 직접 정렬을 지원하지 않습니다. BindingList<T>을 모든 개체의 복사본을 중복으로 만들지 않도록 정렬 할 수 있습니까? 내림차순으로 오름차순으로 정렬해야합니다.

BindingList.Sort() to behave like a List.Sort()에 설명 된대로 특수 클래스 SortableBindingList은 필요하지 않습니다. 나는 하나의 코드에서 두 줄의 짧은 해결책을 찾고있다.

+0

직접 정렬을 지원하지 않는다는 것은 무엇을 의미합니까? –

+0

나는 list.Sort()를 사용할 수 없다는 것을 의미합니다. – Alexander

+0

http://stackoverflow.com/questions/1063917/bindinglistt-sort-to-behave-like-a-listt-sort – MindingData

답변

2

Linq가 작동합니다.

var sortedListInstance = new BindingList<MyClass>(unsortedListInstance.OrderBy(x => x.dt).ToList()); 

MyClass의 인스턴스를 복제하지, 당신은 정렬 된 목록의 얕은 사본을 얻을 명심하십시오.

코드 파일 System.Linq

+2

이것은 처음으로 목록을 만들 때 훌륭한 해결책이라는 점에 유의하십시오. 나중에 항목을 삽입 할 때 올바른 색인에 [삽입] (https://msdn.microsoft.com/en-us/library/ms132696(v=vs.110) .aspx)하십시오. 우선 첫째로. – CompuChip

4

는 바인딩에 정렬을 구현하는 빠른 방법의 상단에있는 네임 스페이스를 포함하는 것을 잊지 마십시오 인수로 constructor that takes a backing IList< T >을 사용하는 것입니다. 보조물로 List<T>을 사용하고 Sort 기능을 사용할 수 있습니다. 목록에 대한 변경이는 바인딩에 반영되도록 목록에 의해 뒷받침되고는 바인딩을 만들 수있는 documentation

사용이는 바인딩 당

. 당신의 MyClass에 다음과 같이 정의 된 경우

는 :

internal class MyClass 
{ 
    public MyClass(string name, Int32 num) 
    { 
     this.Name = name; 
     this.Num = num; 
    } 
    public string Name {get; set;} 
    public Int32 Num {get; set;} 
} 

다음은 Num 필드에 정렬 같은 것을 할 수 있습니다.

private List<MyClass> backing; 
private BindingList<MyClass> bl; 

    private void InitializeBindingList() 
     { 
      backing = new List<MyClass>(); 
      bl = new BindingList<MyClass>(backing); 
      bl.Add(new MyClass("a", 32)); 
      bl.Add(new MyClass("b", 23)); 
      bl.Add(new MyClass("c", 11)); 
      bl.Add(new MyClass("d", 34)); 
      bl.Add(new MyClass("e", 53)); 
     } 

    private void SortBindingList() 
     { 
      backing.Sort((MyClass X, MyClass Y) => X.Num.CompareTo(Y.Num)); 
      // tell the bindinglist to raise a list change event so that 
      // bound controls reflect the new item order 
      bl.ResetBindings(); 
     } 
    } 

당신은 BindingList가 변경된 것을 모든 바운드 컨트롤을 통지하고 컨트롤을 업데이트 할 백업 목록을 정렬 한 후 BindingList.ResetBindings 메소드를 호출 할 필요가있다.

+0

backing-list에 아이템을 추가 할 때의 문제점은'BindingList.ResetBindings'가'TItem'에 대한'PropertyChanged' 이벤트에 대한 이벤트 핸들러를 추가하지 않는다는 것입니다. 단지'BindingList (IList )'생성자 만 그렇게합니다. – Dai

+0

@ 다이, 무슨 뜻인지 이해가 안됩니다. MyClass에서 INotifyPropertyChanged를 구현하기 위해 위의 예제를 수정하면 추가 작업없이 DGV에서 기본 항목의 변경 사항에 응답합니다. 사용 사례에 대해 더 자세히 설명해 주시겠습니까? – TnTinMn

+0

'bl.Add (new MyClass (...)) 대신'backing.Add (new MyClass (..))'를 호출하면))'backing'에 추가 한 후에 'ResetBindings'를 호출하더라도 속성 변경 이벤트 처리가 작동하지 않습니다. – Dai

관련 문제