GTK # Treeview - як сартаваць даччыныя вузлы

У мяне ёсць Gtk.TreeView з даччынымі вузламі, як гэта выява (я прыкрываў тэкст для працадаўцы патэнтаваных прычын):

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

Сартаванне па калонцы «Назва» (пстрыкнуўшы на загалоўку слупка) відаў па 3 бацькоўскіх вузлоў, калі я сапраўды проста хачу, каб адсартаваць усе дзеці да кожнага бацькоўскага вузла. Ці магчыма гэта?

Звярніце ўвагу, што сартаванне па слупка «Шляхі» сартуюць дзіця вузлы належным чынам; Я думаю, таму што бацькоўскія вузлы не маюць тэксту ў гэтым слупку. Так што я спадзяюся, што ёсць (лёгка?) Шлях вакол тэксту ў Стоўбцах Title для бацькоўскіх вузлоў.

4
Што робіць ваш бягучы код фільтра выглядаць? Вы распрацавалі функцыю сартавання? Я думаю, што ў вашым родзе, вы можаце атрымаць шлях да ITER, а затым вызначыць, калі яго глыбіня> 0. Зварот дакладна, калі глыбіня = 0, і запусціць функцыю сартавання, калі> 0.
дададзена аўтар Jeff Halverson, крыніца

1 адказы

Сартаванне трохі складаным, таму што трэба мець некалькі частак кода (мадэль і слупкоў) супрацоўнічаць. Для сартавання па вызначаным слупка, гэта тое, што вам трэба зрабіць:

  1. Create a column (no shortcuts) and assign a value to the SortColumnId attribute. To keep it simple I usually assign the ordinal id of the column, starting from 0, i.e., the first column in the view is 0, the second 1 and so on.
  2. Wrap your model in a Gtk.TreeModelSort
  3. Call SetSortFunc on the new model once for very column you want to sort and pass the column id you set in (1) as first argument. Make sure to match all column ids.

Як радкі сартуюцца ў залежнасці ад дэлегата вы выкарыстоўваеце ў якасці другога аргументу SetSortFunc . Вы атрымліваеце мадэль і два Iters, і вы можаце рабіць амаль усё што заўгодна, нават сартаваць па некалькіх слупках (з двума Iters вы можаце захапіць любое значэнне ад мадэлі, а не толькі значэння, прыведзеныя ў адсартаванай калонцы.)

Вось просты прыклад:

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;
    }
}
1
дададзена