2012-10-01 1 views
0

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

Depuis le seul exemple que j'ai trouvé en Python, j'ai essayé de porter l'exemple 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 j'ai des difficultés avec la méthode ComboChanged.

Après avoir changé la valeur dans la liste déroulante (en sélectionnant une valeur différente) et en plaçant l'objet à l'extérieur de la zone de 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); 
     */ 
    } 

Répondre

1

En passant par l'API un peu plus 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); 
} 
Questions connexes