2010-04-21 7 views
4

큰 컬렉션에 첨부 된 iBindingListView 구현 (제 3 자 dll)에 바인딩 된 DataGridView을 사용하여 문제가 발생했습니다..net 값 클래스 IComparable로 정렬

내 컬렉션 유형에 이름이 MyDateTime 인 특정 속성이 있습니다.이 속성은 DateTime과 비슷한 값 클래스이지만 일부 레거시 코드와도 같습니다.

이 구조체는 iComparable, iComparable<T>iEquatable<T>을 구현합니다. 나는 MyDateTimeColumniBindingListView에 정렬을 적용하면

, 그것은 항상 필요 권투와 언 박싱 수십만의 원인이 아닌 일반 iComparer를 사용

난 데 문제는 이것이다.

DGV에서 제공하는 자동 정렬을 사용하면 열 정렬이 문자열에서 수행됩니다. 이 열에 프로그래밍 방식이 아닌이 열을 '자동'으로 유지하는 것은 허용되지 않습니다.

일반이 아닌 iComparer를 제거하면 일반 텍스트가 사용되지 않고 .ToString()에서 비교되는 문자열 만 수행됩니다.

나는 뭔가를 놓친가요? 제 일반적인 비교자가 왜 일종의 bieng 호출을하지 않았습니까?

+0

"value class"에 의해,'struct'를 의미합니까? 또는 불변'클래스'? –

+0

@Marc : 그는 권투를 언급하기 때문에, 그것은'구조'같이 소리가 난다. –

+0

@Adam - 예, 방금 시도하려고합니다. –

답변

1

궁극적으로이 유형의 데이터 바인딩은 리플렉션 기반이며 반영은 object 기반입니다. 그래서 권투는 현실입니다. 실제로 을 제어 할 수 있습니다. IBindingListView을 구현할 때는 이 될 것이며, 큰 숫자가 일 것입니다.

이 작업을 수행하는 더 간단한 방법은 PropertyDescriptor을 신뢰하고 GetValue을 호출 한 다음 Comparer.Default.Compare(x,y)을 사용하는 것입니다. GetValue을 호출했으면 이 아니라이 아니라 이미 박스로 묶인 객체를 사용하고 있지 않습니다. 그러면 unbox해야합니다.

그리고 당신은하지 신뢰를 할 경우 PropertyDescriptor 당신은이 세상의 일반 ComponentModel보기를 지원하지 않습니다 (그래서 데이터 테이블 또는 맞춤 작동하지 않습니다 매우 구현 고유의 코드로 점점 모델 등).

+0

나는 내가 설정 한 스키마에서 "getvalue"라고하는 부분에 대해 조금 확신 할 수 없다. 감사. – greggorob64

+0

@ greggorob64 -'DataGridView'와'IBindingListView'는 (PropertyDescriptor를 통해) 추상화 된 객체 모델을 기반으로합니다. 예를 들어, 이것은 데이터 표가 논리적 열 이름과 일치하는 특성을 분명히 가지지 않는 경우 데이터 표가 "열"로 데이터를 표시하는 방법입니다. 'PropertyDescriptor'는'GetValue (obj)'메소드를 가지고 있는데, 이것은 제가 언급 한 것입니다. 마찬가지로, 자동 정렬은 PropertyDescriptor 인스턴스를 제공하여 어떤 속성/속성이 관련되어야하는지 알려주는 역할을합니다. –

+0

@ greggorob64 - 이렇게하면'ICustomTypeDescriptor' 또는'TypeDescriptionProvider'를 통해 자신 만의 커스텀 모델을 추가 할 수 있습니다. 당신은'TypeDescriptor.GetProperties (someObject)'(또는 인스턴스 대신'Type'을 전달하기위한 과부하가 있습니다)로 props의 * runtime * 뷰를 얻을 수 있습니다. 여기에는 다른 인터페이스가 많이 포함되어 있습니다. 복잡하고 익숙하지 않은 프레임 워크의 일부입니다. –

1

불행히도이 문제를 해결할 방법이 없습니다. 어느 시점에서 DataGridView은 값 유형 인 경우 object의 값을 처리해야합니다. 즉, 값을 입력해야하는 경우 박스 처리해야합니다.

+0

사실,'DataGridView'는 일반적으로'IBindingListView.ApplySort'를 통해 뷰를 * 정렬하도록 요청합니다. 문제는 상자가 아닌'ApplySort' 구현체를 작성하는 것이 매우 어렵다는 것입니다. 그것은 할 수 있지만, 그것은 끔찍할 것입니다. –

+0

동일한 인터페이스가 구현 된 DateTime 멤버를 정렬하지 않고도 boxing 없이도 정렬 할 수있는 이유는 모르지만 myDateTime 멤버를 사용하면 이해할 수 없습니다. – greggorob64

+0

@ greggorob64 - 특수한 경우에는 'DateTime'과 같은 예상 유형을 사용할 수 있습니다. 귀하의 사용자 정의 유형과 가능성이 없습니다.나는 그때까지 복싱을 피하면서 실제로 놀랐다. –