WinGridデータソースには、グリッドを表示するときにプロパティに割り当てられた同じオブジェクトが含まれています。
ユーザーが WinGrid インターフェースを介して列の順序または可視性を変更しても、基礎となるデータソースはまったく影響を受けません。
私の頭に浮かぶ唯一の解決策(大きなテーブルでは非常に高価です)は、 DataTable Copy()メソッドを使用して別のテーブルを取得し、次にgrid.DisplayLayout.Band[0].Columnsをループしてコピーしたものを使用することですグリッドで非表示になっている列のDataTable Remove()メソッド (Column.Hidden)。
トリッキーな部分は、列の順序です。
DataColumn はSetOrdinalを提供します列の順序を変更するメソッドですが、インデックス 0 から上に向かってこのメソッドを呼び出す必要があると思います。したがって、 Column.Header.VisiblePositionプロパティを使用してグリッド列に別のループが必要です。
しかし、現在、他の問題があります:
1つ目- DataTable の PrimaryKey を削除する必要があります。これは、非表示の場合、Remove() メソッドが妨げられるため
です。
それでは、このコード例のすべてを要約してみましょう: (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++);
}