【问题标题】:How to list all the rows of a Gtk.Treeview如何列出 Gtk.Treeview 的所有行
【发布时间】:2018-12-02 18:55:23
【问题描述】:

我无法掌握 GTK 的 TreeView 的使用,因此我正在浏览一些我在网上找到的示例。将它们放在一起,我无法弄清楚如何提取视图中的信息。我将 TreeView 操作为一个简单的列表,其中包含用于呈现表格数据的列。

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

我正在使用示例 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 是转储信息的好地方,我想在选择节点时将整个树视图内容转储到控制台。

任何帮助指导我完成这项工作(并希望在此过程中理解它)将不胜感激。

【问题讨论】:

    标签: c# mono treeview gtk#


    【解决方案1】:

    虽然肯定不优雅,但我找到了答案,它也更新了模型中的一些数据。如果有人可以改进这一点,我会很高兴。

                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));
                }
    

    【讨论】:

      猜你喜欢
      • 2020-01-19
      • 2011-07-11
      • 1970-01-01
      • 2020-08-23
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多