设置NodeView以反映ListStore模型中的更改

时间:2014-04-07 03:38:41

标签: c# mono monodevelop gtk#

在Linux上使用MonoMonoDevelopC#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

确实显示的唯一更改是以编程方式TreeViewAppendValues。它会在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);

所以,非常感谢时间和希望,这有助于其他盲人傻瓜;)

0 个答案:

没有答案