GTK# Treeview - как отсортировать дочерние узлы
У меня есть Gtk.TreeView
с дочерними узлами, такими как это изображение (я скрыл текст по причинам, связанным с собственностью работодателя):
Сортировка по столбцу "Заголовок" (щелчок по заголовку столбца) сортирует по 3 родительским узлам, когда я просто хочу отсортировать все дочерние элементы под каждым родительским узлом. Это возможно?
Обратите внимание, что сортировка по столбцу "Path" сортирует дочерние узлы соответствующим образом; Я думаю, потому что родительские узлы не имеют текста в этом столбце. Так что я надеюсь, что есть (легкий?) Способ обойти текст в столбце Заголовок для родительских узлов.
1 ответ
Сортировка немного сложна, потому что вам нужно иметь несколько частей кода (модель и столбцы) для взаимодействия. Чтобы отсортировать по определенному столбцу, это то, что вам нужно сделать:
- Создайте столбец (без ярлыков) и присвойте значение
SortColumnId
приписывать. Для простоты я обычно назначаю порядковый номер столбца, начиная с 0, т. Е. Первый столбец в представлении равен 0, второй - 1 и т. Д. - Оберните вашу модель в
Gtk.TreeModelSort
- Вызов
SetSortFunc
на новой модели один раз для самого столбца вы хотите отсортировать и передать идентификатор столбца, который вы установили в (1), в качестве первого аргумента. Убедитесь, что совпадают все идентификаторы столбцов.
Как сортируются строки, зависит от делегата, который вы используете в качестве второго аргумента SetSortFunc
, Вы получаете модель и два итера, и вы можете делать практически все, даже сортируя по нескольким столбцам (с помощью двух итеров вы можете получить любое значение из модели, а не только значения, показанные в отсортированном столбце.)
Вот простой пример:
class MainClass
{
public static void Main (string[] args)
{
Application.Init ();
var win = CreateTreeWindow();
win.ShowAll ();
Application.Run ();
}
public static Gtk.Window CreateTreeWindow()
{
Gtk.Window window = new Gtk.Window("Sortable TreeView");
Gtk.TreeIter iter;
Gtk.TreeViewColumn col;
Gtk.CellRendererText cell;
Gtk.TreeView tree = new Gtk.TreeView();
cell = new Gtk.CellRendererText();
col = new Gtk.TreeViewColumn();
col.Title = "Column 1";
col.PackStart(cell, true);
col.AddAttribute(cell, "text", 0);
col.SortColumnId = 0;
tree.AppendColumn(col);
cell = new Gtk.CellRendererText();
col = new Gtk.TreeViewColumn();
col.Title = "Column 2";
col.PackStart(cell, true);
col.AddAttribute(cell, "text", 1);
tree.AppendColumn(col);
Gtk.TreeStore store = new Gtk.TreeStore(typeof (string), typeof (string));
iter = store.AppendValues("BBB");
store.AppendValues(iter, "AAA", "Zzz");
store.AppendValues(iter, "DDD", "Ttt");
store.AppendValues(iter, "CCC", "Ggg");
iter = store.AppendValues("AAA");
store.AppendValues(iter, "ZZZ", "Zzz");
store.AppendValues(iter, "GGG", "Ggg");
store.AppendValues(iter, "TTT", "Ttt");
Gtk.TreeModelSort sortable = new Gtk.TreeModelSort(store);
sortable.SetSortFunc(0, delegate(TreeModel model, TreeIter a, TreeIter b) {
string s1 = (string)model.GetValue(a, 0);
string s2 = (string)model.GetValue(b, 0);
return String.Compare(s1, s2);
});
tree.Model = sortable;
window.Add(tree);
return window;
}
}