我能想到的只是与ComboBox.GetEnumerator或类似的东西有关。
我想做点什么:
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 :(得分: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 :(得分:1)
如果您将ComboBox
的元素存储在Array
或List
for (int i = 0; i < combo.Model.IterNChildren(); ++i) //iterate over ComboBox elements
{
if (myList[i].Equals(elementToSelect))
{
combo.Active = i;
break;
}
}
答案 2 :(得分:0)
我遇到了类似的问题,C#中的这个答案很有帮助,但C语言中的最终解决方案看起来非常不同。我在这里发帖是因为它是谷歌搜索的第一个。
基本上,如果您正在查看GTK ComboBox并使用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);
希望有所帮助。