在Linux上使用Mono
,MonoDevelop
,C#
和GTK#
。
我知道以前曾经问过这个问题,但无论我尝试什么,这些例子或答案似乎都不适合我。我仍然无法将ListStore
中的更改反映在我的TreeView
中。
我是这样的......
ListStore ls_nvDeviceFileDescription = new ListStore (typeof(string), typeof(string), typeof(string));
ListStore ls_dev_sensor_codes = new ListStore (typeof(string));
ListStore ls_dev_sensor_value_types = new ListStore (typeof(string));
第一个ListStore
适用于TreeView
,第二个和第三个CellRendererCombo
适用于TreeView
的第1列和第3列。< / p>
我为CellRendererCombo
添加了值,以便用户从....中选择值。
string[] _codes = csql.CSQL_GetDeviceSensorCodes ();
string[] _types = csql.CSQL_GetDeviceSensorValueTypes ();
// Do codes.
if (_codes != null) {
for (int i = 0; i < _codes.Length; i++) {
ls_dev_sensor_codes.AppendValues (_codes [i]);
}
}
//Do Types
if (_types != null) {
for (int i = 0; i < _types.Length; i++) {
ls_dev_sensor_value_types.AppendValues (_types [i]);
}
}
然后我将ListStore
绑定到他们适当的两个CellRenderers
....
dev_sensor_codes.Model = ls_dev_sensor_codes;
dev_sensor_codes.TextColumn = 0;
dev_sensor_value_types.Model = ls_dev_sensor_value_types;
dev_sensor_value_types.TextColumn = 0;
当然,将它们打包到各自的列上......
col_sensor_code.PackStart (dev_sensor_codes, true);
col_sensor_descr.PackStart (dev_sensor_descr, true);
col_sensor_value_type.PackStart (dev_sensor_value_types, true);
然后我还绑定ListStore
TreeView
并附加我的所有列....
nvDeviceFileDescr.Model = ls_nvDeviceFileDescription;
nvDeviceFileDescr.AppendColumn (col_sensor_code);
nvDeviceFileDescr.AppendColumn (col_sensor_descr);
nvDeviceFileDescr.AppendColumn (col_sensor_value_type);
我还使用以下代码向我的TreeView
添加一行(IS反映的唯一更改)。
ListStore store = (ListStore)nvDeviceFileDescr.Model;
TreeIter iter = store.Append ();
TreePath path = store.GetPath (iter);
nvDeviceFileDescr.SetCursor (path, nvDeviceFileDescr.Columns[0], true);
现在,我将提供两个我确定应该有效的编辑事件示例,但不会......
示例1:
dev_sensor_codes.Edited += delegate(object o, EditedArgs args)
{
ListStore store = (ListStore)nvDeviceFileDescr.Model;
TreeSelection sel = nvDeviceFileDescr.Selection;
TreeIter iter;
if (!sel.GetSelected (out iter)) {
return;
}
store.SetValue(iter, 1, args.NewText);
};
示例2:
dev_sensor_value_types.Edited += delegate(object o, EditedArgs args)
{
ListStore store = (ListStore)nvDeviceFileDescr.Model;
TreeIter iter;
store.GetIterFromString(out iter, args.Path);
store.SetValue (iter, 2, args.NewText);
};
在这两个例子中,我都知道我使用了一个好的iter
,因为gtk
有一个很好的习惯,如果你有陈旧的话,我会告诉你(我认为?),{ {1}},必须很好,因为它已通过编辑TreePath
。
我可以通过打印到args
验证我是否获得了所有正确的版本,路径和值,但我无法在stdout
中获取ListStore
的更改}反映在Treeview
。
确实显示的唯一更改是以编程方式TreeView
或AppendValues
。它会在Append
中添加一个新行,但不会显示任何值。
很多,非常感谢任何人的帮助。
==========================================
因此,正如通常情况那样,我们回答自己的问题,因为我们忽略了正确阅读我们自己的代码吗?
我在上面的整个事情中遗漏了一个关键步骤,它将CellRenderers绑定到实际列。它看上去&#39;就像我一样,但我没有,所以这里...... [/ p>
我使用以下内容将CellRenderers打包在列中....
TreeView
Column.PackStart (CellRenderer, Bool);
//Or in my case
col_sensor_code.PackStart (dev_sensor_codes, true);
这很好,但我还需要将CellRenderer绑定到THAT列(或实际上任何其他列)SO ......
Column.PackStart (CellRenderer, Bool);
//Or in my case
col_sensor_code.PackStart (dev_sensor_codes, true);
所以,非常感谢时间和希望,这有助于其他盲人傻瓜;)