2011-01-15 2 views
7

비교적 간단한 질문입니다. 나는 Datagridview를 가지고 있는데, 그 모두가 통계를 표시한다. 행을 편집/추가/삭제할 필요가 없습니다. DataGridview는 List에 바인드됩니다. 내가 성취하고자하는 것은 사용자가 열을 정렬 할 수있게하는 것입니다.List에있는 Datagridview 데이터 소스 정렬 <T> 여기서 T는 익명입니다.

class Market 
{ 
    public int Location {get;set;} 
    public float Value {get;set;} 
    //... 
} 
class City 
{ 
    public String Name {get;set;} 
    //... 
} 

List<Market> _markets; 
List<City> _cities; 
//Lists are populated. 

dataGridView1.DataSource = _markets.Select(market => 
    new { _cities[market.Location].Name, market.Value}).ToList(); 

예상대로 열은 정렬 할 수 없지만 표시되는 정보는 원하는 것입니다. 내 질문에 코드를 통해 여러 번 사용됩니다 최소 복잡하고 최소한의 코드 금액을 가진 열 형식을 기반으로 DataGridView 정렬을 만드는 방법입니다.

이 응용 프로그램은보기가있는 데이터베이스를 사용하는 데 사용됩니다. 그런 다음 이러한 뷰는 DataGridView를 채 웁니다. 보기는 여전히 약하므로 가능한 해결책이 될 수있다 :

DataBase.ViewMarketValue temp = new DataBase.ViewMarketValue() 

_markets.ForEach(market => temp.AddViewMarketValueRow(_cities[market.Location].Name, market.Value); 
dataGridView1.DataSource = temp; 

이 원하는 결과 모든 정보를 가지고있는 DataGridView하며 정렬된다. 유일한 문제는이 측면에서보기를 사용하는 것이 잘못된 것처럼 보입니다. 그래서 내가 무엇을해야하니?

답변

10

DataGridView에서 자동으로 데이터를 정렬하려면 IBindingListView을 구현하는 컬렉션이 필요합니다. BCL에서이 인터페이스를 구현하는 클래스는 DataViewBindingSource입니다 (그러나 후자는 기본 데이터 소스에서 지원하는 경우에만 정렬을 지원합니다).

  • 이 데이터를 보유하기 위해 DataTable를 만들고, 자신의 컬렉션을 만들
  • (실제로는 DataTableDefaultView에 바인딩)을 DataGridView에 바인딩 :

    그래서, 당신은 몇 가지 옵션이 있습니다 IBindingListView

  • this post에 Marc Gravell이 게시 한 AdvancedList<T> 클래스와 같은 기존 구현을 사용합니다. 쿼리의 결과는 익명 형식이기 때문에

    public AdvancedList(IEnumerable<T> collection) 
    { 
        foreach (var item in collection) 
        { 
         Add(item); 
        } 
    } 
    

, 당신은 생성자를 호출 할 수 없습니다 : 당신은 또한 당신의 쿼리의 결과에서 목록을 구축하는 생성자를 추가해야합니다 직접. 이 문제를 해결하는 가장 쉬운 방법은 목록을 만들 수있는 일반적인 메서드를 만들어 형식 유추를 이용하는 것입니다. 편의를 위해, 당신은 확장 메서드로 만들 수 있습니다

public static AdvancedList<T> ToAdvancedList<T>(this IEnumerable<T> source) 
{ 
    return new AdvancedList<T>(source); 
} 

당신은 그처럼 사용할 수 있습니다

dataGridView1.DataSource = _markets.Select(market => 
    new { _cities[market.Location].Name, market.Value}).ToAdvancedList(); 
+0

아주 좋은 해결책을! 내 유일한 불만 (그리고 그것은 작은 것입니다) 그 정렬 이상적으로 빠르지 않다지만, 그것은 용납 할 수있는 지금까지 최고의 것입니다. –

+1

리플렉션을 사용하여 속성 값을 가져 오기 때문에 속도가 느립니다. PropertyComparer 클래스를 쉽게 수정하여 생성 될 때 대리자를 생성하고 property.GetValue 대신이 위임을 사용합니다. –

+0

@ThomasLevesque 제안을 구현하기 위해 일부 코드 스 니펫을 게시 할 수 있다면 좋을 것입니다. 감사합니다. – Esen

관련 문제