Frage

Alles, was ich herausfinden kann, ist etwas, mit dem ComboBox.GetEnumerator oder so etwas zu tun.

Ich möchte so etwas wie tun:

System.Collections.IEnumerator e = this.task_difficulty_combobox.GetEnumerator();
while (e.MoveNext())
{
    if (e.ToString() == this.task.Difficulty.ToString())
    {
        Gtk.TreeIter i = (Gtk.TreeIter)e.Current;
        this.task_difficulty_combobox.SetActiveIter(i);
        break;
    }
}

Dies ist jedoch nicht funktioniert.

War es hilfreich?

Lösung

Der Grund, Ihr Code nicht funktioniert, ist, dass die „Elemente in der Combobox“ verpackt tatsächlich die Zelle Renderer in sie sind für Spalten von Daten. Um an den aktuellen Daten zu erhalten, müssen Sie das TreeModel Objekt.

Wenn Sie wirklich müssen basierend wählen nur auf das, was in der Combo, hier ist, wie Sie es tun können:

string[] values = new string[]{"one", "two", "three"};
var combo = new ComboBox(values);

Gtk.TreeIter iter;
combo.Model.GetIterFirst (out iter);
do {
  GLib.Value thisRow = new GLib.Value ();
  combo.Model.GetValue (iter, 0, ref thisRow);
  if ((thisRow.Val as string).Equals("two")) {
    combo.SetActiveIter (iter);
    break;
  }
} while (combo.Model.IterNext (ref iter));

Es ist jedoch im Allgemeinen prägnanter Ihre Werte indiziert zu halten, wie folgt aus:

List<string> values = new List<string>(){"one", "two", "three"};  
var combo = new ComboBox(values.ToArray());

// Select "two"
int row = values.IndexOf("two");
Gtk.TreeIter iter;
combo.Model.IterNthChild (out iter, row);
combo.SetActiveIter (iter);

Andere Tipps

Als Alternative Sie den „ausgewählten Index“ wie folgt gesetzt werden können, wenn Sie die Elemente des ComboBox in einem Array gespeichert oder List

for (int i = 0; i < combo.Model.IterNChildren(); ++i) //iterate over ComboBox elements
{
  if (myList[i].Equals(elementToSelect))
  {
    combo.Active = i;
    break;
  }
}

Ich hatte ein ähnliches Problem und diese Antwort in C # war hilfreich, aber die End-Lösung in C sieht ganz anders aus. Ich poste hier, weil es die erste für Google-Suchen auf es war.

Im Grunde genommen, wenn Sie in einem GTK ComboBox suchen und die GTK Tree Model verwenden und hoffen, dass die Informationen zu erhalten, müssen Sie die iter Muster verwenden, genau richtig. Die Wrapper für andere Sprachen wie Python und C # hat es ein bisschen einfacher, aber für diejenigen, die noch mit C mit GTK, hier ist die Lösung:

Angenommen, Sie eine flache gtk Combobox haben und Sie brauchen nur etwas aus ihm heraus zu bekommen, können Sie so etwas wie dies für c:

int set_combo_box_text(GtkComboBox * box, char * txt) 
{
   GtkTreeIter iter;
   GtkListStore * list_store;
   int valid;
   int i;
   list_store = gtk_combo_box_get_model(box);

   // Go through model's list and find the text that matches, then set it active
   i = 0; 
   valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(list_store), &iter);
   while (valid) {
      gchar *item_text;
      gtk_tree_model_get (GTK_TREE_MODEL(list_store), &iter, 0, &item_text, -1); 
      printf("item_text: %s\n", item_text);
      if (strcmp(item_text, txt) == 0) { 
         gtk_combo_box_set_active(GTK_COMBO_BOX(box), i);
         return true;
         //break;
      }    
      i++; 
      valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list_store), &iter);
   }
   printf("failed to find the text in the entry list for the combo box\n");
}

Wenn Sie weitere Informationen in jeder Combobox Linie zu speichern, können Sie weitere Informationen aus dem iter mit so etwas wie diese:

valid = gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, 0, &item_0, 1, &item_1, 2, &item_2, ... , -1); 

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top