【发布时间】:2015-02-03 11:10:52
【问题描述】:
在我将一些项目添加到 GTK 树视图后,我需要从代码中选择列表中的第一个项目以触发 treeviewcursorchanged 事件,即:单击树视图项目时。我需要选择第一个树视图项目。但是没有选择事件。 我用字符串填充树视图
liststore = new ListStore (typeof(string));
treeview1.Model = liststore;
【问题讨论】:
在我将一些项目添加到 GTK 树视图后,我需要从代码中选择列表中的第一个项目以触发 treeviewcursorchanged 事件,即:单击树视图项目时。我需要选择第一个树视图项目。但是没有选择事件。 我用字符串填充树视图
liststore = new ListStore (typeof(string));
treeview1.Model = liststore;
【问题讨论】:
您必须使用与Gtk.TreeView 关联的Gtk.TreeSelection。要选择第一行,只需执行以下操作:
Gtk.TreeIter iter;
if (liststore.GetIterFirst(out iter))
treeview1.Selection.SelectIter(iter);
这是一个完整的示例,它创建了一个列表视图/模型,向选择更改事件添加了一个信号处理程序,然后将第一行设置为选中:
var view = new Gtk.TreeView();
var cell = new Gtk.CellRendererText();
var col1 = new Gtk.TreeViewColumn();
col1.Title = "Column 1"
col1.PackStart(cell, true);
col1.AddAttribute(cell, "text", 0);
view.AppendColumn(col1);
var model = new Gtk.ListStore(typeof(string));
model.AppendValues("AAA");
model.AppendValues("BBB");
model.AppendValues("CCC");
view.Model = model;
// This is the selection changed handler: I use a lambda but
// it is as easy to use a delegate `Changed` is a standard C#
// event.
view.Selection.Changed += (sender, e) => {
Console.WriteLine("SELECTION WAS CHANGED");
Gtk.TreeIter selected;
if (view.Selection.GetSelected(out selected)) {
Console.WriteLine("SELECTED ITEM: {0}", model.GetValue(selected, 0)));
}
};
Gtk.TreeIter iter;
if (model.GetIterFirst(out iter))
view.Selection.SelectIter(iter);
【讨论】:
GtkTreeView 中的选择逻辑被分离到它自己的类 GtkTreeSelection。每个GtkTreeView 都有自己的GtkTreeSelection,可通过gtk_tree_view_get_selection() 获得。
获得GtkTreeSelection 后,您只需为要选择的行获取GtkTreeIter 并调用gtk_tree_selection_select_iter()。您还可以构建一个GtkTreePath 并使用gtk_tree_selection_select_path() 选择它。
如何获得GtkTreeIter 或GtkTreePath 取决于您。 These are the methods that apply to GtkTreePaths and GtkTreeModels. GtkListStore 也是 GtkTreeModel 和 has its own methods。
【讨论】:
select_iter() 左右),并且可能会散布各种refs 和outs。 Mono 文档网站上的 Gtk.TreeSelection、Gtk.TreeModel 和 Gtk.TreePath 页面应该会有所帮助……如果这些是正确版本的 GTK+。