2009-10-30 54 views
3

我能弄明白的是与ComboBox.GetEnumerator或类似的东西有关。如何设置Gtk.ComboBox的值?

我想这样做:

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

然而,这不起作用。

+0

你确定最内层的代码运行吗? – 2009-10-31 16:22:32

回答

5

您的代码无法正常工作的原因是“组合框中的项目”实际上是打包到其中以显示数据列的单元格渲染器。为了获得实际的数据,你需要TreeModel对象。

如果你真的必须选择仅基于什么的组合,这里是你如何能做到这一点:

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

然而,通常它更简洁,让您的值索引,如:

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

由于如果有存储在ArrayList

ComboBox的元件可以设置“选择的索引”像这样的替代
for (int i = 0; i < combo.Model.IterNChildren(); ++i) //iterate over ComboBox elements 
{ 
    if (myList[i].Equals(elementToSelect)) 
    { 
    combo.Active = i; 
    break; 
    } 
} 
0

我有一个类似的问题,并在C#中的这个答案是有帮助的,但在C中的最终解决方案看起来非常不同。我在这里发布,因为它是谷歌搜索的第一个。

基本上,如果您正在查看GTK组合框并使用GTK树模型,并且希望获取信息,则必须正确使用iter模式。 Python和C#等其他语言的包装使得它更容易一些,但对于那些仍然使用C与GTK的人来说,这里是解决方案:

假设你有一个平坦的gtk组合框,并且你只需要获取某些东西这一点,你可以使用类似这样的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"); 
} 

如果你在每个组合框线存储更多的信息,您可以得到更多的信息了使用像这样的国际热核实验堆的:

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

希望有所帮助。