2012-02-13 5 views
2

사용자가 해당 열의 순서를 변경할 수있는 UltraWinGrid가 있습니다. 또한이 표의 DataSource를 DataTable로 보내야하는 양식의 단추가 있습니다. 보고서를 생성하는 클래스 나는 DataTable을에 데이터 소스를 캐스팅하기 위해 다음 코드를 사용했습니다 :UltraWinGrid의 열 순서 변경

(DataTable)UltraGrid1.DataSource 

을하지만 문제는이 새로운 DataTable의 열 순서는 사용자 세트 ... 는 어떻게 변경할 수 보이는 순서가되지 않는 것입니다 UltraWinGrid의 DataSource가 화면의 Grid에서 지금 볼 수있는 것까지 ??

+0

왜 순서는 DataTable의에서 동일해야합니까? WinGrid는 DataTable의 순서와 관계없이 올바른 순서로 데이터를 계속 표시 할 수 있어야합니까? 그렇지 않은 경우 열의 키가 일치하지 않아 그리드가 새 밴드와 열을 만들 수 있습니다. NewBandLoadStyle 및/또는 NewColumnLoadStyle로 테스트하여 DisplayLayout을 false로 설정하여이를 확인하십시오. DataTable의 열 이름이 모눈의 열 키와 일치하는지 확인하는 것이 좋습니다. – alhalama

+0

@ alhalama, reply.but 주셔서 감사합니다. 내 문제를 올바르게 설명 할 수 없다고 생각합니다. 응용 프로그램 사용자는 WinGrid (예 : 그리드에서보고 싶은 열을 선택하고 순서를 변경)를 수정 한 다음 '인쇄'버튼을 누르면 현재 열과 시퀀스 및 데이터가있는 현재 WinGrid가 DataTable 유형의 매개 변수로 클래스에 전송됩니다. 지금 나는 무엇을해야합니까 ??? –

+0

도와주세요 ... –

답변

0

그리드를 표시 할 때 WinGrid 데이터 원본에는 동일한 개체가 속성에 할당되어 있습니다.
사용자가 WinGrid 인터페이스를 통해 열의 순서 또는 가시성을 변경하면 기본 데이터 소스는 전혀 영향을받지 않습니다.
내 생각에 떠오르는 유일한 솔루션 (대형 테이블의 경우 매우 비쌉니다)은 DataTable Copy() 메서드를 사용하여 작업 할 다른 테이블을 얻은 다음 grid.DisplayLayout.Band [0] .Columns를 반복합니다. 복사 한 DataTable Remove() 모눈에 숨겨진 열 (Column.Hidden)에 대한 메서드를 사용하십시오.
까다로운 부분은 열의 순서입니다.
DataColumn은 SetOrdinal 메서드를 사용하여 열 순서를 변경하지만 인덱스 0부터 시작하여이 메서드를 호출해야한다고 가정합니다. 따라서 Column.Header.VisiblePosition 속성을 사용하여 그리드 열에 다른 루프가 필요합니다.
그러나 다른 문제가 지금있다 :
먼저 - 숨겨진 경우 DataTable의 기본 키가 있기 때문에 제거해야합니다, 방지 제거() 메소드
둘째 - SetOrdinal에 사용하면 VisiblePosition 지수가 연속 될 수 없었고 범위를 벗어난 항목을 가리킬 수 있습니다.

그래서이 예제 코드에서 모든 것을 요약 해 보자는 : (Collection.Generics와 Linq에 필요)

Dictionary<int, string> gPos = new Dictionary<int,string>(); 
DataTable dtCopy = (grid.DataSource as DataTable).Copy(); 
dtCopy.PrimaryKey = null; 
foreach(UltraGridColumn gCol in grid.DisplayLayout.Bands[0].Columns) 
{ 
    if(gCol.Hidden == true) 
     dtCopy.Columns.Remove(gCol.Key); 
    else 
     gPos.Add(gCol.Header.VisiblePosition, gCol.Key); 
} 
var list = gPos.Keys.ToList(); 
list.Sort(); 
int realPos = 0; 
foreach (var key in list) 
{ 
    dtCopy.Columns[gPos[key]].SetOrdinal(realPos++); 
} 
+0

OP로 확인하기 만하면됩니다. 당신은 당신의 과제를 해결 했습니까? – Steve

0

열을 반복하고 Header.VisiblePosition 속성을 사용하여 열의 순서를 결정할 수 있습니다. 주문을 결정한 후에는 DataTable에서 적절한 주문을 설정해야합니다.