изменить последовательность столбцов UltraWinGrid - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть UltraWinGrid в моей форме, который пользователь позволил изменить последовательность столбцов в нем. Также в моей форме есть кнопка, чтобы он отправлял DataSource этой Grid в виде DataTable в класс, который генерирует отчет.Я использовал следующий код для преобразования DataSource в DataTable:

(DataTable)UltraGrid1.DataSource

, но проблема в том, что последовательность столбцов в этом новом DataTable не является видимой последовательностью, которую устанавливает пользователь ... Как я могу изменитьисточник данных UltraWinGrid, что я могу видеть в Grid на экране сейчас ??

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

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++);
}
0 голосов
/ 15 февраля 2012

Вы можете перебрать столбцы, а затем использовать свойство Header.VisiblePosition, чтобы определить порядок столбцов. После того, как вы определите порядок, вам нужно будет установить соответствующий порядок в вашей DataTable.

...