GTK#Treeview - 如何对子节点进行排序

时间:2011-10-27 22:25:12

标签: c# gtk gtk# gtktreeview

我有一个Gtk.TreeView子节点就像这张图片一样(由于雇主专有原因,我已经覆盖了文字):

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

按“标题”列排序(单击列标题)按3个父节点排序,当我真的只想让它对每个父节点下的所有子节目进行排序时。这可能吗?

请注意,按“路径”列排序会对子节点进行适当的排序;我认为因为父节点在该列中没有文本。所以我希望在父节点的Title列中有一个(简单?)方法。

1 个答案:

答案 0 :(得分:1)

排序有点复杂,因为您需要将代码的几个部分(模型和列)合作。要对您需要执行的特定列进行排序:

  1. 创建列(无快捷方式)并为SortColumnId属性指定值。为了简单起见,我通常会从0开始分配列的序号id,即视图中的第一列为0,第二列为1,依此类推。
  2. 将您的模型包裹在Gtk.TreeModelSort
  3. 在新模型上调用SetSortFunc一次,查找要排序的列,并将您在(1)中设置的列ID作为第一个参数传递。确保匹配所有列ID。
  4. 行的排序方式取决于您用作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;
        }
    }