Кажется, это не так просто, как я надеялся:
Используя wxWidgets (стабильная серия 2.8), у меня есть wxGrid (без подкласса) с настраиваемым «адаптером данных» ”Как класс, производный от wxGridTableBase.
wxGrid* grid = new wxGrid (this, ID_TABLE);
grid->SetTable (new TableAdapter (foo, bar, baz));
grid->EnableEditing (false);
sizer->Add(grid, wxSizerFlags (1).Expand());
«Простая» вещь, которую я не могу найти, - это способ обновить сетку при изменении базовой модели данных. Простого вызова wxWindow :: Update ( pGrid-> Update ()
) явно недостаточно, чтобы заставить сетку вызвать базовую реализацию wxGridTableBase?
wxGrid* const grid = (wxGrid* const) FindWindow (ID_TABLE);
if (NULL != grid) {
grid->Update ();
grid->AutoSizeColumns ();
}
В частности, эта сетка действует как список, и строки будут добавляться и удаляться из него асинхронно тем же или (потенциально) другим процессом - это список общих данных, который может обновляться любой из нескольких сетевых систем. Сама сетка / список фактически доступна только для чтения; другие элементы управления используются для добавления и удаления элементов, и каждая строка имеет один атрибут логического типа, который также можно переключать.
Кажется, что новые строки не добавляются в представление, и удаление строк вызовет прерывистые SEGV в коде рисования wx.
Из-за механизма динамического / асинхронного обновления я надеюсь избежать необходимости постоянно удалять и повторно добавлять сетку в окно, так как я уверен, что это вызовет всевозможные мерцания и мерзость ... так что я прибегну к такой грубой силе, если это будет абсолютно необходимо, но я решительно предпочитаю избегать этого.
К сожалению, несмотря на то, что она отмечена как «стабильная версия», документация wxGrid, похоже, в основном состоит из еще не написанных
тегов.
Обновлено:
У меня возникают подозрения, что это проблема с компоновкой контейнера. При рисовании сетки нижняя часть сетки (последняя строка) может фактически перекрывать как фрейм wxStaticBox вокруг своей части окна wxFrame, так и часть строки состояния фрейма. Добавление и удаление строк, похоже, не приводит к изменению макета контейнера; Я экспериментирую с попыткой вызвать Layout
и тому подобное. В идеале это должна быть область прокрутки, но wxGrid должен по-прежнему быть «ограниченным» в пределах своего содержащего Sizer.
Макет фактически состоит из статического блока, содержащего вертикальный блок, первым элементом которого является горизонтальный блок кнопок, затем сетка, как это:
--[ Static Box ]------------------------
| |
| [Button] [Button] [Button] |
| |
| ----------------------------------- |
| | | A | B | C | |
| |-----------------------------------| |
| | 1 | 1a | 1b | 1c | |
| ----------------------------------- |
| |
----------------------------------------
К сожалению, политика компании запрещает мне публиковать скриншоты : - (
Если это важно, это (в настоящее время) wxGTK-2.8.12 в Fedora 16 (x86_64), хотя я наблюдаю идентичное поведение в CentOS5 / RHEL5 с использованием пакетов EPEL (Fedora).