Монополучение позиции узла в TreeView

Мне нужно получить позицию узла в Gtk.TreeView. Я могу получить строку и то, что пользователь изменил, но мне нужно хардкор столбца, есть ли способ, как его получить?

Здесь код:

private void artistNameCell_Edited (object o, Gtk.EditedArgs args)
{
 Gtk.TreeIter iter;

 musicListStore.GetIter (out iter, new Gtk.TreePath (args.Path));

 Song song = (Song) musicListStore.GetValue (iter, 0);
 song.Artist = args.NewText;
}

Это отсюда http://www.mono-project.com/GtkSharp_TreeView_Tutorial, это редактируемый раздел текстовых ячеек. В коде они просто выбирают номер столбца 0: -/, но мне нужны любые клики пользователей колонок. Соответственно, точное положение узла выглядит как node[row,column], теперь у меня есть только node[iter,0].

3 ответа

Я запускал образец программы GTkDemo, который поставляется с картой Mono в Windows (каталог samples), и я мог бы редактировать образцы редактируемых ячеек дерева, я вставляю код, где он обрабатывает событие,

private void TextCellEdited(object o, EditedArgs args)
{
TreePath path = new TreePath(args.Path);
TreeIter iter;
store.GetIter(out iter,path);
int i = path.Indices[0];
Item foo = (Item)articles[i];
foo.Product = args.NewText;
store.SetValue (iter, (int) Column.Product, foo.Product);
}

Где хранится ListStore. Я рекомендую вам увидеть полный исходный код, он поставляется с Mono Framework для Windows в разделе [Program files (x86)]\Mono-2.10.8\samples\gtk-sharp-2.0\GtkDemo.

Надеюсь, это поможет вам.


В API GTK+ C вы получите ссылку на CellRendererText в качестве первого аргумента для вашего обработчика сигнала. Я считаю, что вы можете получить доступ к этому в GTK # как args.Args [0], но я не уверен в этом на 100%.

Я не вижу очевидного способа перейти от объекта CellRendererText к соответствующему столбцу в TreeStore (но я мог ошибаться в этом). Чтобы это было полезно, вам, возможно, придется составить собственное сопоставление.

Альтернативой будет использование другого обработчика событий для события Edited каждого CellRendererText и убедитесь, что каждый обработчик знает правильный номер столбца.


вы можете определить обработчик событий, как это

int i = counter;
cellTextRenderer.Edited +=( sender, args) => {
 TreePath path = new TreePath (args.Path);
 TreeIter iter;
 musicListStore.GetIter (out iter, path); 
 //i is column number
 musicListStore.SetValue (iter, i, args.NewText);
};

licensed under cc by-sa 3.0 with attribution.