Tôi có một keyPressed tín hiệu trong Gtk #/mono C# cho hai mục đích khác nhau mà không có mặt trong các mặc định TreeView: a) đi đến các tế bào tiếp theo bằng cách nhấn TAB, và b) bắt đầu chỉnh sửa bằng cách nhấn phím bất kỳ.Làm cách nào để quản lý các thao tác nhấn phím cho các mục đích đặc biệt trong Gtk # TreeView?
Các TreeView rất đơn giản, nó có một ListStore chỉ hiển thị các hàng và cột, tức là nó chứa dữ liệu dạng bảng.
Mã tôi có bên dưới.
[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;
}
Tôi có hai câu hỏi:
Làm thế nào tôi có thể báo hiệu cho TreeView rằng một tế bào đã được hoàn tất chỉnh sửa? Vấn đề là nếu bạn nhấn TAB khi không có ô nào đang được chỉnh sửa, mọi thứ đều hoạt động tốt. Tuy nhiên, nếu người dùng đang chỉnh sửa ô thì nội dung đã nhập cho đến thời điểm này sẽ bị mất. Vì vậy, trong trường hợp người dùng đang chỉnh sửa ô, tôi muốn báo hiệu cho TreeView để hoàn tất ấn bản và thực hiện theo hành vi hiện tại.
Làm cách nào để tránh mất khóa đầu tiên khi chỉnh sửa ô? Giả sử bạn đang ở trên một ô. Bạn nhấn các phím 1, 2, 3 và 4. Trình xử lý của tôi sẽ can thiệp chính xác và đặt ô hiện tại ở chế độ ấn bản. Tuy nhiên, ô chỉ nhận được 2, 3 và 4, mặc dù tôi đang đặt
arg.RetVal
thành false.
Thông tin về chức năng của tôi
GetCurrentCell(row, col)
dịch tế bào hiện tại từ một TreePath để một cặp ints.SetCurrentCell(row, col, [edit])
sử dụngTreeView.SetCursor()
để tạo dòng điện.edit
có thể là đúng hoặc false. Nếu đúng, thì ô sẽ được đưa vào phiên bản. Nếu nó là false, không có gì được chỉnh sửa.