Question

Quelqu'un pourrait-il m'indiquer la bonne direction sur la façon de mettre à jour un Gtk.TreeView après avoir changé un CellRendererCombo dans Gtk# ?

Comme le seul exemple que j'ai trouvé était en Python, j'ai essayé de porter l'exemple en C#, mais sans succès jusqu'à présent.

L'exemple Python est ici : http://learngtk.org/pygtk-tutorial/cellrenderercombo.html

Dans le code ci-dessous, je rencontre des difficultés avec la méthode ComboChanged.

Après avoir modifié la valeur dans la liste déroulante (en sélectionnant une valeur différente) et placé le focus en dehors de la liste déroulante, la valeur ne change pas.

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);
        */
    }
Était-ce utile?

La solution

En parcourant un peu plus l'API, j'ai trouvé la solution... :

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top