GTK#Treeview - 子ノードをソートする方法

私はこのイメージのような子ノードを持つ Gtk.TreeView を持っています(私は雇用主の専有理由のためにテキストを隠しています):

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

「タイトル」列(列ヘッダーをクリック)でソートすると、3つの親ノードがソートされます。各親ノードの下にあるすべての子ノードを並べ替えるだけです。これは可能ですか?

「Path」列によるソートは子ノードを適切にソートすることに注意してください。私は親ノードがその列にテキストを持っていないので、私は思う。ですから、親ノードのTitle列のテキストの周りに(簡単な)方法があることを望んでいます。

4
あなたの現在のフィルタコードはどのように見えますか?ソート機能を設計しましたか?私はあなたのソートの中でiterのパスを取得し、その深さが0より大きいかどうかを判断できます。depth = 0の場合はtrueを返し、> 0の場合はsort関数を実行します。
追加された 著者 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 の第2引数として使用するデリゲートによって異なります。モデルと2つのiterを取得し、複数の列をソートすることもできます(ソートされた列に表示されている値だけでなく、モデルから任意の値を取得できます)。

ここに簡単な例があります:

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
追加された