如何列出Gtk.Treeview的所有行

时间:2018-06-23 15:12:08

标签: c# mono treeview gtk#

我在掌握GTK的TreeView的使用方面遇到了麻烦,因此我在网上查找了一些示例。将它们放在一起,我无法解决如何在视图中提取信息。我将TreeView作为带有列表的简单列表的简单List进行操作。

我对模型,商店和实际树视图本身的角色感到困惑。

我正在使用示例here

using System;
using System.Collections;
using Gtk;

public class Actress
{
    public string Name;
    public string Place;
    public int Year;

    public Actress(string name, string place, int year)
    {
        Name = name;
        Place = place;
        Year = year;
    }
}

public class SharpApp : Window
{
    ListStore store;
    Statusbar statusbar;

    enum Column
    {
        Name,
        Place,
        Year
    }

    Actress[] actresses =
    {
        new Actress("Jessica Alba", "Pomona", 1981),
        new Actress("Sigourney Weaver", "New York", 1949),
        new Actress("Angelina Jolie", "Los Angeles", 1975),
        new Actress("Natalie Portman", "Jerusalem", 1981),
        new Actress("Rachel Weissz", "London", 1971),
        new Actress("Scarlett Johansson", "New York", 1984) 
    };

    public SharpApp() : base ("ListView")
    {
        BorderWidth = 8;

        SetDefaultSize(350, 250);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };

        VBox vbox = new VBox(false, 8);


        ScrolledWindow sw = new ScrolledWindow();
        sw.ShadowType = ShadowType.EtchedIn;
        sw.SetPolicy(PolicyType.Automatic, PolicyType.Automatic);
        vbox.PackStart(sw, true, true, 0);

        store = CreateModel();

        TreeView treeView = new TreeView(store);
        treeView.RulesHint = true;
        treeView.RowActivated += OnRowActivated;
        sw.Add(treeView);

        AddColumns(treeView);

        statusbar = new Statusbar();

        vbox.PackStart(statusbar, false, false, 0);

        Add(vbox);
        ShowAll();
    }

    void OnRowActivated (object sender, RowActivatedArgs args) {

        TreeIter iter;        
        TreeView view = (TreeView) sender;   

        if (view.Model.GetIter(out iter, args.Path)) {
            string row = (string) view.Model.GetValue(iter, (int) Column.Name );
            row += ", " + (string) view.Model.GetValue(iter, (int) Column.Place );
            row += ", " + view.Model.GetValue(iter, (int) Column.Year );
            statusbar.Push(0, row);
        }
        // *** if I can dump treeview to the console here I'll be happy ***
        // *** I'd prefer a foreach or do/while ***
    }

    void AddColumns(TreeView treeView)
    {
        CellRendererText rendererText = new CellRendererText();
        TreeViewColumn column = new TreeViewColumn("Name", rendererText,
            "text", Column.Name);
        column.SortColumnId = (int) Column.Name;
        treeView.AppendColumn(column);

        rendererText = new CellRendererText();
        column = new TreeViewColumn("Place", rendererText, 
            "text", Column.Place);
        column.SortColumnId = (int) Column.Place;
        treeView.AppendColumn(column);

        rendererText = new CellRendererText();
        column = new TreeViewColumn("Year", rendererText, 
            "text", Column.Year);
        column.SortColumnId = (int) Column.Year;
        treeView.AppendColumn(column);
    }


    ListStore CreateModel()
    {
        ListStore store = new ListStore( typeof(string),
            typeof(string), typeof(int) );

        foreach (Actress act in actresses) {
            store.AppendValues(act.Name, act.Place, act.Year );
        }

        return store;
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

在代码的顶部创建一个女演员数组,该数组用于填充ListStore(在代码的末尾),而ListStore则用于填充TreeView。

我想遍历树视图的数据并更新其中的列。

为此,由于OnRowActivated是转储信息的好地方,因此我希望在选择节点时将整个treeview内容转储到控制台。

在指导我完成此工作(并希望在此过程中有所了解)方面的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

虽然肯定不是很优雅,但我找到了答案,该答案还更新了模型中的某些数据。如果有人能对此有所改善,我会很高兴。

            TreeIter iter;            
            TreeModel model = tv.Model;

            if (model.GetIterFirst(out iter))
            {
                do
                {
                    newYear = ModifyYear((string)model.GetValue(iter, (int)Column.Year));
                    Console.WriteLine("Updating: {0} -- {1} {2}",
                                  (string)model.GetValue(iter, (int)Column.Name),
                                          model.GetValue(iter, (int)Column.Year),
                                          newYear );
                    model.SetValue(iter, (int)Column.Year, (int)newYear);

                } while (model.IterNext(ref iter));
            }