2

フォームに UltraWinGrid があり、ユーザーが列のシーケンスを変更できるようにしました。また、フォームに、このグリッドの DataSource を DataTable としてレポートを生成するクラスに送信するボタンがあります。次のコードを使用して、DataSource を DataTable にキャストしました。

(DataTable)UltraGrid1.DataSource

しかし、問題は、この新しい DataTable の列のシーケンスが、ユーザーが設定した可視シーケンスではないことです... UltraWinGrid の DataSource を、画面上のグリッドに表示されるものに変更するにはどうすればよいですか??

4

2 に答える 2

0

列をループしてから、Header.VisiblePosition プロパティを使用して列の順序を決定できます。順序を決定したら、DataTable で適切な順序を設定する必要があります。

于 2012-02-15T05:47:10.483 に答える
0

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++);
}
于 2012-02-19T09:49:47.043 に答える