그리드를 표시 할 때 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++);
}
왜 순서는 DataTable의에서 동일해야합니까? WinGrid는 DataTable의 순서와 관계없이 올바른 순서로 데이터를 계속 표시 할 수 있어야합니까? 그렇지 않은 경우 열의 키가 일치하지 않아 그리드가 새 밴드와 열을 만들 수 있습니다. NewBandLoadStyle 및/또는 NewColumnLoadStyle로 테스트하여 DisplayLayout을 false로 설정하여이를 확인하십시오. DataTable의 열 이름이 모눈의 열 키와 일치하는지 확인하는 것이 좋습니다. – alhalama
@ alhalama, reply.but 주셔서 감사합니다. 내 문제를 올바르게 설명 할 수 없다고 생각합니다. 응용 프로그램 사용자는 WinGrid (예 : 그리드에서보고 싶은 열을 선택하고 순서를 변경)를 수정 한 다음 '인쇄'버튼을 누르면 현재 열과 시퀀스 및 데이터가있는 현재 WinGrid가 DataTable 유형의 매개 변수로 클래스에 전송됩니다. 지금 나는 무엇을해야합니까 ??? –
도와주세요 ... –