4

私はGtk.TreeViewこの画像のような子ノードを持っています(私は雇用主独自の理由でテキストを隠しました):

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

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

「パス」列で並べ替えると、子ノードが適切に並べ替えられることに注意してください。親ノードの列にテキストがないためだと思います。したがって、親ノードの[タイトル]列のテキストを(簡単に?)回避できる方法があることを期待しています。

4

1 に答える 1

2

コードのいくつかの部分 (モデルと列) が連携する必要があるため、並べ替えは少し複雑です。特定の列で並べ替えるには、次のことを行う必要があります。

  1. 列を作成し (ショートカットなし)、SortColumnId属性に値を割り当てます。簡単にするために、通常、0 から始まる列の序数 ID を割り当てます。つまり、ビューの最初の列は 0、2 番目の列は 1 というようになります。
  2. モデルをGtk.TreeModelSort
  3. SetSortFunc並べ替えたい列に対して新しいモデルを 1 回呼び出し、(1) で設定した列 ID を最初の引数として渡します。すべての列 ID が一致していることを確認してください。

行がどのようにソートされるかは、 の 2 番目の引数として使用するデリゲートによって異なりますSetSortFunc。モデルと 2 つの iter を取得すると、ほとんど何でも実行できます。複数の列での並べ替えも可能です (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;
    }
}
于 2013-02-22T15:34:50.350 に答える