Ho una keyPressed segnale in Gtk #/mono C# per due scopi differenti che non sono presenti nel default TreeView: a) passare alla cella successiva premendo TAB, e b) avviare la modifica premendo qualsiasi chiave.Come gestire la pressione dei tasti per scopi speciali in Gtk # TreeView?
Il TreeView è semplice, ha una ListStore mostrando solo righe e colonne, cioè esso contiene i dati tabulari.
Il codice che ho è di seguito.
[GLib.ConnectBefore]
protected void OnTableKeyPressed(object o, Gtk.KeyPressEventArgs args)
{
int rowIndex;
int colIndex;
// Do not "eat" the key, by default
args.RetVal = false;
// Get the current position, needed in both cases.
this.GetCurrentCell(out rowIndex, out colIndex);
// Adapt the column
colIndex += NumFixedColumns;
if (args.Event.Key != Gdk.Key.ISO_Enter) {
if (args.Event.Key == Gdk.Key.Tab
|| args.Event.Key == Gdk.Key.ISO_Left_Tab)
{
if(args.Event.State == Gdk.ModifierType.ShiftMask) {
// Back
colIndex -= 1;
if (colIndex < 1) {
colIndex = document.Columns;
--rowIndex;
}
rowIndex = Math.Max(0, rowIndex);
} else {
// Advance
colIndex += 1;
if (colIndex > document.Columns) {
colIndex = 1;
++rowIndex;
}
rowIndex = Math.Min(rowIndex, document.Rows);
}
this.SetCurrentCell(rowIndex, colIndex);
args.RetVal = true; // Eat the TAB
} else {
this.SetCurrentCell(rowIndex, colIndex, true);
}
}
return;
}
Ho due domande:
Come posso segnalare al TreeView che una cellula è stata terminata la modifica? Il problema è che se si preme TAB quando nessuna cella viene modificata, tutto funziona correttamente. Tuttavia, se l'utente sta modificando una cella, i contenuti immessi finora vengono persi. Quindi, nel caso in cui l'utente stia modificando una cella, desidero segnalare allo strumento TreeView di completare l'edizione e portare avanti il comportamento corrente.
Come evitare di perdere la prima chiave quando si modifica una cella? Di 'che sei al di sopra di una cella. Premi i tasti 1, 2, 3 e 4. L'handler interferisce correttamente e mette la cella corrente in modalità di edizione. Tuttavia, la cella ottiene solo 2, 3 e 4, anche se sto impostando
arg.RetVal
a false.
Info su mie funzioni
GetCurrentCell(row, col)
traduce la cella corrente da un TreePath a una coppia di int.SetCurrentCell(row, col, [edit])
utilizzaTreeView.SetCursor()
per rendere corrente una cella.edit
può essere true o false. Se true, la cella viene messa in edizione. Se è false, non viene modificato nulla.