【问题标题】:Updating TreeView after changing CellRendererCombo (Gtk#)更改 CellRendererCombo (Gtk#) 后更新 TreeView
【发布时间】:2012-09-22 16:20:17
【问题描述】:

在 Gtk# 中更改 CellRendererCombo 后,有人可以指出如何更新 Gtk.TreeView 的正确方向吗?

由于我找到的唯一示例是 Python,因此我尝试将示例移植到 C#,但到目前为止没有成功。

Python 示例在这里:http://learngtk.org/pygtk-tutorial/cellrenderercombo.html

在下面的代码中,我在使用 ComboChanged 方法时遇到了困难。

更改组合框中的值(通过选择不同的值)并将焦点放在组合框之外后,该值不会改变。

using System;
using Gtk;
using System.Collections.Generic;

public partial class MainWindow: Gtk.Window
{   
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();
        var tvComboBox = InitTreeViewWithComboBox ();
        var vbox = new Gtk.VBox ();
        vbox.PackStart (tvComboBox, true, true, 0);
        this.Add (vbox);
        this.ShowAll ();
    }       

    // adopted from http://learngtk.org/pygtk-tutorial/cellrenderercombo.html
    ListStore liststore_hardware;
    ListStore liststore_manufacturers;

    private TreeView InitTreeViewWithComboBox ()
    {
        liststore_manufacturers = new Gtk.ListStore(typeof (string));
        var manufacturers = new List<string> {"Sony", "LG", "Panasonic", "Toshiba", "Nokia", "Samsung"};
            foreach (var item in manufacturers) {
            liststore_manufacturers.AppendValues (item);
        }

        liststore_hardware = new Gtk.ListStore(typeof (string), typeof (string));
        liststore_hardware.AppendValues ("Television", "Samsung");
        liststore_hardware.AppendValues ("Mobile Phone", "LG");
        liststore_hardware.AppendValues ("DVD Player", "Sony");

        var treeview = new Gtk.TreeView ();
        treeview.Model = liststore_hardware;

        var column_text = new TreeViewColumn { Title = "Text" };
        var column_combo = new TreeViewColumn { Title = "Combo" };
        treeview.AppendColumn (column_text);
        treeview.AppendColumn (column_combo);

        var cellrenderer_text = new CellRendererText ();
        column_text.PackStart (cellrenderer_text, false);
        column_text.AddAttribute (cellrenderer_text, "text", 0);


        var cellrenderer_combo = new CellRendererCombo ();
        cellrenderer_combo.Editable = true;
        cellrenderer_combo.Model = liststore_manufacturers;
        cellrenderer_combo.TextColumn = 0;
        column_combo.PackStart (cellrenderer_combo, false);
        column_combo.AddAttribute (cellrenderer_combo, "text", 1);

        cellrenderer_combo.Edited += ComboChanged;

        return treeview;
    }

    void ComboChanged (object o, EditedArgs args)
    {
        // Not really sure what to do here....

        /*
        var crc = o as CellRendererCombo;
        TreeIter iter; // index within the combobox
        if (!crc.Model.GetIterFirst (out iter)) {
            return;
        }
        crc.Model.SetValue (iter, 0, args.NewText);
        liststore_hardware.SetValue (iterHardware, 1, args.NewText);
        */
    }

【问题讨论】:

    标签: c# combobox gtk# gtktreeview cellrenderer


    【解决方案1】:

    通过 API 多一点,我找到了解决方案...:

    void ComboChanged (object o, EditedArgs args)
    {
        TreeSelection selection = treeview.Selection;
        TreeIter iter;
        if (!selection.GetSelected (out iter)) {
            return;
        }
        liststore_hardware.SetValue (iter, 1, args.NewText);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2019-03-21
      • 2019-07-21
      • 1970-01-01
      相关资源
      最近更新 更多