Ich habe ein KeyPressed Signal in GTK #/Mono-C# für zwei verschiedene Zwecke, die in dem Standard nicht vorhanden sind TreeView: a) zur nächsten Zelle gehen von TAB drücken, und b) der Bearbeitung beginnen durch Drücken irgendein Schlüssel.Wie man Tasten drücken für spezielle Zwecke in Gtk # TreeView?
Die TreeView ist einfach, es hat ein ListStor nur Zeilen und Spalten zeigen, das heißt, es tabellarische Daten enthält.
Der Code, den ich habe, ist unten.
[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;
}
Ich habe zwei Fragen:
Wie kann ich auf das TreeView Signal, dass eine Zelle die Bearbeitung beendet wurde? Das Problem ist, dass wenn Sie TAB drücken, wenn keine Zelle bearbeitet wird, alles gut funktioniert. Wenn der Benutzer jedoch eine Zelle bearbeitet, gehen die bisher eingegebenen Inhalte verloren. Also, wenn der Benutzer eine Zelle bearbeitet, möchte ich dem TreeView signalisieren, um die Ausgabe zu beenden, und das Weitermachen mit dem aktuellen Verhalten.
Wie kann ich vermeiden, den ersten Schlüssel beim Bearbeiten einer Zelle zu verlieren? Angenommen du bist über einer Zelle. Sie drücken die Tasten 1, 2, 3 und 4. Mein Handler interferiert korrekt und setzt die aktuelle Zelle in den Editiermodus. Die Zelle erhält jedoch nur 2, 3 und 4, obwohl ich
arg.RetVal
auf false setze.
Info über meine Funktionen
GetCurrentCell(row, col)
übersetzt die aktuelle Zelle von einem TreePath zu einem Paar von ints.SetCurrentCell(row, col, [edit])
verwendetTreeView.SetCursor()
, um eine Zelle Strom zu machen.edit
kann true oder false sein. Wenn true ist, wird die Zelle in edition eingefügt. Wenn es false ist, wird nichts bearbeitet.