GTK # Treeview - как отсортировать дочерние узлы - PullRequest
4 голосов
/ 28 октября 2011

У меня есть Gtk.TreeView с дочерними узлами, подобными этому изображению (я скрыл текст по причинам, связанным с собственностью работодателя):

http://i.stack.imgur.com/kKemI.png

Сортировка по столбцу «Заголовок» (щелчок по заголовку столбца) сортирует по 3 родительским узлам, когда я действительно хочу отсортировать все дочерние элементы под каждым родительским узлом. Это возможно?

Обратите внимание, что сортировка по столбцу "Path" сортирует дочерние узлы соответствующим образом; Я думаю, потому что родительские узлы не имеют текста в этом столбце. Поэтому я надеюсь, что есть (легкий?) Способ обойти текст в столбце Заголовок для родительских узлов.

1 Ответ

1 голос
/ 22 февраля 2013

Сортировка немного сложна, потому что вам нужно иметь несколько частей кода (модель и столбцы) для взаимодействия.Для сортировки по определенному столбцу вам нужно:

  1. Создать столбец (без ярлыков) и присвоить значение атрибуту SortColumnId.Для простоты я обычно присваиваю порядковый идентификатор столбца, начиная с 0, т. Е. Первый столбец в представлении равен 0, второй - 1 и т. Д.
  2. Оберните вашу модель в Gtk.TreeModelSort
  3. Вызовите 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;
    }
}
...