Selektion beim Scrollen sichern
Ein Misfeature des »LiveGrid« von Rico 2.0 ist der Verlust der Selektion sobald man anfängt zu scrollen bzw. zu blättern. Selbst wenn die eigentlich selektierte Zeile noch sichtbar in der Tabelle liegt, verschwindet die Selektion beim Refresh.
Wahrscheinlich wurde dieses Feature schlicht vergessen. Glücklicherweise sind die dazu benötigten Haken bereits im Framework vorhanden und es läßt sich relativ einfach hinzu programmieren, indem eine externe Funktion nach dem Refresh des Grids aufgerufen wird. Das folgende Beispiel verdeutlicht dieses.
Als erstes wird eine Möglichkeit benötigt, die Selektion zu speichern. Dazu wird eine eindeutige Spalte in der Tabelle benötigt. Sie muß nicht sichtbar, sondern nur vorhanden sein. In diesem Fall ist es die erste Spalte. Wenn eine Zeile selektiert wird, wird der Wert dieser Spalte in der aktuellen Zeile in einer zusätzlichen Variable gesichert.
var options = { menuEvent: 'contextmenu', highlightElem: "menuRow", click: drilldown, onRefreshComplete: grid_refresh_complete }; var buffer = new Rico.Buffer.AjaxSQL('ricoXMLquery.php', {}); var grid = new Rico.LiveGrid ('LiveGrid', buffer, options); grid.menu = new Rico.GridMenu(); grid.edit = new Rico.TableEdit(grid); var selection = undefined; function drilldown(e) { val col = 0; var row = grid.edit.drillDown(e,0,0); selection = grid.columns[col].getValue(row); } function grid_refresh_complete(startpos, endpos) { val col = 0; if (grid.highlightIdx != undefined) { var rows = maingrid.columns[col].numRows(); for (var r=0; r < rows; r++) if (grid.columns[col].getValue(r) && grid.columns[col].getValue(r) == selection) { var idx = grid.highlightIdx; idx.row = r; maingrid.menuIdx = idx; maingrid.highlight(idx); break; } } }
Zusätzlich wird eine Funktion bei jedem Refresh der Tabelle aufgerufen, die prüft, ob die vorher selektierte Zeile vielleicht sichtbar ist und stellt die Hervorhebung wieder her. Dazu werden alle potentiell sichtbaren Zeilen im »LiveGrid« mit dem gespeicherten Wert verglichen.