2008-11-04 3 views
1

다른 것과 비슷한 Gridview 정렬에 문제가 있지만 데이터 테이블과 달리 컬렉션 개체에 바인딩됩니다.Winforms에서 ASP.NET 2.0 Webforms로 이동할 때 Gridview 정렬 문제가 발생했습니다.

응용 프로그램의 기존 비즈니스 규칙 및 데이터 액세스 계층은 개체가있는 패턴과 해당 형식의 개체 컬렉션이 필요한 경우 CollectionBase를 상속하고 IBindingList를 구현하는 다른 클래스를 갖습니다.

데스크톱 응용 프로그램의 경우 이러한 개체 중 하나에 대한 gridview를 쉽게 데이터 바인딩 할 수 있었으며 열 정렬을 설정하는 데 문제가 없었습니다. 데스크톱 앱의 프리젠 테이션 레이어에서 모든 것이 '상태'였습니다.

이제 코드가 새 웹 응용 프로그램 (ASP.NET 2.0, VB 코드 숨김 페이지)으로 이동됩니다.

전 컬렉션의 특정 열을 그리드 뷰에 표시하고 그리드 뷰를보기 만하면되는 것처럼 놀았습니다. '정렬 허용'을 켰을 때 문제가 나타났습니다.

. 소팅 방법 등을 사용하지 않는 것에 대한 오류가 발생했습니다.이 문제를 조사하면서 데이터 소스가 데이터 테이블 인 경우 데이터 테이블을 사용하면 쉽게 구현할 수있는 모든 종류의 솔루션을 발견했습니다. 하지만 그렇지 않습니다. 컬렉션입니다. 나는 XML 메모리 스트림으로 컬렉션을 변환하여 데이터 소스로 "값싼 샷"을 시도했지만 데이터 셋으로 .ReadXML을 다시 시도했지만 작동하지 않았다. [루트 요소가 누락되었습니다. 데이터 세트에있는 한 멀리있었습니다. ReadXml (ioTemp) 여기서 ioTemp는 xml serializer에서 사용되는 System.IO.MemoryStream입니다.]

이전 데스크톱 응용 프로그램 덕분에 그리드 뷰가로드 된 후에도 컬렉션을 정렬하는 것에 대해 걱정할 필요가 없었습니다. 사실 컬렉션의 .SortProperty, .SortDirection 및 .ApplySort는 모두 NotSupportedExceptions를 통해 '표준'입니다 (필자는 오랫동안 사라진이 프로그래머의 코드를 상속 받았다).

매번 데이터베이스로 돌아 가지 않고도 컬렉션을 데이터 테이블이나 컬렉션을 정렬하는 쉬운 방법으로 변환 할 수 있습니까? 객체 데이터 소스는 객체 작성 방법의 복잡한 규칙 때문에 작동하지 않습니다. VS2005의 마법사는 우리가해야 할 일 (객체를 만들기 위해 조건부로 여러 테이블에서 데이터를 가져 오는 것)을 처리 할 수 ​​없습니다.

미리 감사드립니다.

답변

0

원래이 질문을 던진 이후로 나는 새로운 '표준'을 구현하여 비즈니스 개체 모음을 일반 목록으로 만들었습니다. 지금 그래서

(성능에 문제가 있었다)이처럼 보이는 정렬 방법과 함께 "(MyBusinessObject의) 상속 목록"에 지나지 않는 "컬렉션 클래스"

Public Overloads Sub Sort(ByVal strPropertyName As String, ByVal strDirection As String) 
    Dim arSortedList As New ArrayList 
    For Each item As MyBusinessObject In Me 
     arSortedList.Add(item) 
    Next 
    arSortedList.Sort(New CaseInsensitiveComparer(Of MyBusinessObject)(strPropertyName, strDirection)) 
    For intI As Integer = 0 To arSortedList.Count - 1 
     Item(intI) = arSortedList(intI) 
    Next 
End Sub 

이를 GridView에서 이벤트를 발생시키는 데 사용되는 방법론을 완벽하게 사용하는 것으로 보입니다.

0

비슷한 문제가있어서 개체에 IComparable을 구현해야했습니다. 기본적으로 개체 컬렉션을 정렬하려면 순서를 구분할 방법이 필요합니다. IComparable 인터페이스에는 .Net 프레임 워크가 정렬 할 때 개체의 순서를 처리 할 수있게하는 Compare라는 메서드가 있습니다. 정렬 메소드를 작동 시키려면이 메소드를 직접 구현해야합니다. 내가 이러한 경우 반드시 질수 있도록

Google results

당신은 당신이 오류를 게시 할 수 있습니다, 오류 메시지를 언급하지 않는다?

편집 :

귀하의 의견과 관련하여; 다중 열 정렬을 구현할 수 있습니다. 더 많은 작업이 필요합니다. 컬렉션을 정렬 할 필드를 지정한 다음 CompareTo 메서드 내에서이 정보를 사용할 수 있습니다.

Have a look at this

+0

ICompare는 간단한 정렬에 적합하지만이 경우는 그리드에서 클릭하는 모든 열을 정렬하기위한 것입니다. 거기에 이미 화면에있는 격자를 정렬하는 간단한 방법이 있어야합니다 ... – David

+0

당신은 그렇게 생각하지만, 나는 Kaius가 불행히도 정확하다고 생각합니다. 내일 프로젝트 중 하나를 들여다 보려고 노력할 것입니다. – tbone

0

당신은 분명히 자신의 개체의 컬렉션으로 그리드를 채우는 것을 감안할 때,이 객체에 대한 Linq에 대한 완벽한 일처럼 들린다. 약간의 팔꿈치 그리이스 만 있으면 효과적으로 컬렉션에 대한 SQL Select 문을 얻을 수 있습니다. 아주 멋진 것들. 또한

http://www.hookedonlinq.com/LINQtoObjects5MinuteOverview.ashx

, 당신은 정말 그냥 그리드의 데이터를 정렬 하시겠습니까? 그렇다면, 확실히 당신의 물건에 대해 Linq 사용을 추구 할 것입니다. 그러나 그리드의 내용을 정렬하는 것은 실제로 그리드를 정렬하는 데 거의 사용되지 않습니다 ("그리드 정렬"은 일반적으로 그리드를 채우는 데 사용되는 데이터의 액세스 경로를 변경하는 것으로 해석됩니다). 브라우저 응용 프로그램은 Windows 응용 프로그램과 같지 않으며 Windows의 DataGridView가 상황을 비연하게 만드는 것과 같이 마술처럼 일을 진행시키기 위해 기본 데이터 소스에 상시 연결.

+0

아마도이 문제를 힘을 설득하여 ASP.NET 2.0보다 '현대적'으로 나아가 야한다는 것을 확신 할 수있었습니다. 불행히도, 이것은 정부 기관입니다. – David

2

대신 고객 측 정렬을 고려 했습니까?

저는 과거에 ASP Gridviews에서 jquery tablesorter 플러그인을 사용했습니다.

http://tablesorter.com/

+0

난 그냥 tablesorter 스크립트를 사용하고 정말 잘 작동했습니다. 그것은 19k 스크립트입니다. 코드가 작동하도록 RowDataBound 이벤트에 코드를 추가해야했습니다. – deanblank

0

당신은 헤더의 각 열의로하지 않게합니다 이벤트와 링크 버튼을 넣을 수 있습니다.

이벤트가 트리거되면 클릭 한 헤더를 알아냅니다 (헤더 당 하나의 메소드 또는 commandArgument 값). 일단 알게되면 객체 컬렉션에서 .orderBy 또는 .OrderByDescending을 수행하고 그 결과를 다시 gridview 및 databind의 데이터 소스로 넣습니다.