我有一些数据存储区,包含一些字段(例如field1,field2等),我想在ComboBoxEntry中显示该类的List。我为IEnumerable创建了扩展方法:
public static ListStore ToListStore<T>(this IEnumerable<T> Parent)
{
ListStore returnedValue = new ListStore(typeof (object));
//ListStore returnedValue = new ListStore (typeof(string));
if (Parent != null)
{
foreach (T node in Parent)
{
returnedValue.AppendValues (node);
//next two lines is just for testing.
TreeIter hello;
bool res = returnedValue.GetIterFirst (out hello);
}
}
return returnedValue;
}
我按下一个方式填写ComboBoxEntry:
public static void SetGenericModel<T>(this ComboBox Parent, IEnumerable<T> Model, CellLayoutDataFunc LayoutFuncForModel)
{
ListStore store = Model.ToListStore ();
/*ListStore store = new ListStore (typeof(string));
store.AppendValues("a");
store.AppendValues("b");*/
CellRendererText genericClassCell = new CellRendererText();
//Parent.Clear ();
Parent.PackStart(genericClassCell, true);
Parent.SetCellDataFunc(genericClassCell, LayoutFuncForModel);
TreeIter treeIter;
store.GetIterFirst (out treeIter);
Parent.Model = store;
/*int columnsCount = Parent.Model.NColumns;
Parent.Model.GetIterFirst (out treeIter);
object obj = Parent.Model.GetValue (treeIter, columnsCount - 1);
Parent.Clear ();*/
}
好的,输出工作正常,但是当我尝试选择ComboBoxEntry的某些项目时,我的应用程序崩溃而没有一些例外,只有输出窗口包含一些信息:*“(MyAppName:14822):GLib-GObject-WARNING ** :无法从类型'GtkSharpValue'“*的值设置'gchararray'类型的属性'text'。但是如果我创建ListStore作为字符串(注释代码):
ListStore store = new ListStore (typeof(string));
store.AppendValues("a");
store.AppendValues("b");
然后总是工作得很好。
我的代码出了什么问题,如何解决这个问题(我应该用我的对象填充ComboBoxEntry,因为当用户选择某个项目时,我应该将其作为数据存储项处理)?
答案 0 :(得分:0)
我认为ComboboxEntry总是希望默认情况下第一列是文本。也许这可以通过一些技巧来覆盖。但似乎合乎逻辑的是,文本条目期望值是文本,而不是图标或其他任何内容......
现在,我知道Combobox(基类)默认情况下第一列为文本。您注释掉了这行代码:
Parent.Clear ();
让您清除任何默认设置并打包自己的渲染器。
下一步是当你想要阅读Combobox的内容时,你必须使用TreeIter检索值,如下所示:
TreeIter iter;
if (Combo.GetActiveIter(out iter))
{
var value = (YourClass)this.Combo.Model.GetValue(iter, 0);
}