Esto no parece ser tan simple como yo esperaba:Refrescante wxGrid con contenidos dinámicos
Uso de wxWidgets (2.8 series estable), tengo un wxGrid (no subclase) con un adaptador de datos “” personalizados como una clase derivada de wxGridTableBase.
wxGrid* grid = new wxGrid (this, ID_TABLE);
grid->SetTable (new TableAdapter (foo, bar, baz));
grid->EnableEditing (false);
sizer->Add(grid, wxSizerFlags (1).Expand());
Lo “simple” que no puedo encontrar una manera de actualizar la ventana cuando los cambios subyacentes modelo de datos. Simplemente llamando a wxWindow :: Update (pGrid->Update()
) es aparentemente insuficiente para que la grilla llame a la implementación subyacente de wxGridTableBase.
wxGrid* const grid = (wxGrid* const) FindWindow (ID_TABLE);
if (NULL != grid) {
grid->Update();
grid->AutoSizeColumns();
}
En particular, esta rejilla está actuando como una lista, y tendrá filas añadirse y eliminarse de ella de forma asíncrona, por el mismo o (potencialmente) otro proceso - es una lista de datos compartida que puede ser actualizado por cualquiera de varios sistemas en red. La grilla/lista en sí es efectivamente de solo lectura; otros controles se utilizan para agregar y eliminar elementos, y cada fila tiene un atributo de tipo booleano que también se puede alternar.
Parece que las filas nuevas no se agregan a la vista, y al eliminar filas se generarán SEGV intermitentes en el código de dibujo wx.
Debido al mecanismo dinámico/asíncrono actualización, estoy esperando para evitar tener que eliminar y volver a añadir la red a la ventana constantemente, como estoy seguro de que va a causar todo tipo de parpadeo y maldad ... por lo tanto, recurriré a intentar algo así como fuerza bruta, si es absolutamente necesario, pero preferiría evitarlo.
Desafortunadamente, a pesar de estar marcado como la "versión estable", la documentación de wxGrid parece consistir principalmente en Yet to be written
etiquetas.
Actualizado: Estoy empezando a sospechar que se trata de un problema de diseño de contenedor. Al dibujar la cuadrícula, la parte inferior de la cuadrícula (última fila) puede solaparse tanto con el marco wxStaticBox alrededor de su sección de la ventana wxFrame, como con parte de la línea de estado del marco. Agregar y eliminar filas no parece obligar a un nuevo diseño del contenedor; Estoy experimentando tratando de llamar al Layout
y similares. Idealmente, esto debería ser una región de desplazamiento, pero el wxGrid debería estar "restringido" dentro de su Sizer.
El diseño consta, efectivamente, de una caja estática, que contiene una caja vertical, el primer elemento de los cuales es una caja horizontal de botones, a continuación, la red, como así:
--[ Static Box ]------------------------
| |
| [Button] [Button] [Button] |
| |
| ----------------------------------- |
| | | A | B | C | |
| |-----------------------------------| |
| | 1 | 1a | 1b | 1c | |
| ----------------------------------- |
| |
----------------------------------------
Desafortunadamente, política de la empresa me prohíbe publicar capturas de pantalla :-(
Si es importante, esto es (actualmente) wxGTK-2.8.12 en Fedora 16 (x86_64), aunque estoy viendo un comportamiento idéntico en CentOS5/RHEL5 usando el EPEL (Fedora) paquetes.
(para repetir lo que mencioné a continuación, donde alguien puede encontrarlo :) Me temo que nunca encontré una mejor solución, y nos movimos a la serie beta de wxWidgets 2.9, luego dejé ese trabajo, entonces ... lo que tengo debajo efectivamente funcional, pero no muy agradable. : -/ – BRFennPocock