【问题标题】:GTK# Treeview - how to sort child nodesGTK# Treeview - 如何对子节点进行排序
【发布时间】:2011-10-27 22:25:12
【问题描述】:

我有一个Gtk.TreeView 带有像这张图片这样的子节点(出于雇主专有的原因,我已经掩盖了文本):

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

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

【问题讨论】:

  • 您当前的过滤器代码是什么样的?你设计过排序功能吗?我认为在您的排序中,您可以获取迭代器的路径,然后确定其深度是否 > 0。如果深度 = 0,则返回 true,如果 > 0,则运行您的排序函数。

标签: c# gtk gtk# gtktreeview


【解决方案1】:

排序有点复杂,因为您需要让代码的多个部分(模型和列)协同工作。要对特定列进行排序,您需要执行以下操作:

  1. 创建一个列(无快捷方式)并为SortColumnId 属性分配一个值。为简单起见,我通常分配列的序号 id,从 0 开始,即视图中的第一列为 0,第二列为 1,依此类推。
  2. 将您的模型包裹在Gtk.TreeModelSort
  3. 在新模型上调用SetSortFunc 一次,以获得您想要排序的列,并将您在 (1) 中设置的列 ID 作为第一个参数传递。确保匹配所有列 ID。

行的排序方式取决于您用作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;
    }
}

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2018-01-16
    • 2017-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多