WinGrid Источник данных содержит тот же объект, назначенный свойству при отображении сетки.
Если ваш пользователь изменяет порядок или видимость столбцов через интерфейс WinGrid, базовый источник данных не затрагивается вообще .
Единственное решение (очень дорогое для больших таблиц), которое мне приходит в голову, - это метод DataTable Copy () для получения другой таблицы для работы, а затем цикл по сетке .DisplayLayout.Band [0] .Columns и использовать скопированный метод DataTable Remove () для столбцов, которые скрыты в сетке (Column.Hidden).
Сложная часть - это порядок столбцов.
DataColumn предоставляет метод SetOrdinal для изменения порядка столбцов, но, я полагаю, вам нужно вызывать этот метод, начиная с нуля индекса вверх. Поэтому вам нужен еще один цикл для столбцов сетки с использованием свойства Column.Header.VisiblePosition .
Но теперь есть и другие проблемы:
Первый - DataTable PrimaryKey должен быть удален, потому что, если он скрыт, предотвращает метод Remove ()
Second - Индекс VisiblePosition не может быть последовательным и, если он используется в SetOrdinal, может указывать на элемент вне диапазона.
Итак, давайте суммируем все в этом примере кода: (требуется 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++);
}