В этой заметке рассматривается вопрос работы с контролом TreeView, используя библиотеку GTK# на платформе .NET Mono.
К сожалению, в сети очень мало информации по работе с этой технологией и этим контролом в частности. Поэтому Tree View в GTK# и рассматривается в этой заметке. В частности, вопросы, которые касаются хранения в нодах этого контрола отдельнх классов, содержищах данные, обработку и выборку данных по двойному щелчку.
Для примера взято дерево, которое хранит в программе документы (для примера мануалы). Соответственно, в дереве могут содержаться как разделы, так и непосредственно документы.
Объявим класс, для примера, просто содержащий две открытых строки. В реальном примере в нем могут размещаться любые объекты, к примеру, текстовые документы и прочие данные.
publicclass Parrams
{
publicstring first;
publicstring seckond;
public Parrams()
{
first = "Перывая строка";
seckond = "Вторая строка";
}
}
Gtk.TreeViewColumn manualColumn = new Gtk.TreeViewColumn ();
manualColumn.Title = "Тематика";
Gtk.CellRendererText manualNameCell = new Gtk.CellRendererText ();
manualColumn.PackStart (manualNameCell, true);
manualColumn.AddAttribute (manualNameCell, "text", 0);
Gtk.TreeStore manualTree = new Gtk.TreeStore (typeof (string), typeof(object));
Gtk.TreeIter iter = manualTree.AppendValues ("Linux", new Parrams() );
manualTree.AppendValues ("Windows",
new Parrams() );
Gtk.TreeIter centos = manualTree.AppendValues (iter, "CentOS", new Parrams());
Gtk.TreeIter hosting = manualTree.AppendValues (centos, "Hosting",
new Parrams() );
manualTree.AppendValues (centos, "Остальное",
new Parrams() );
TV_ManualStructure.AppendColumn (manualColumn);
TV_ManualStructure.Model = manualTree;
ShowAll ();
Примером выполнения будет дерево, которое показано на иллюстрации ниже:
Пояснение к коду:
TV_ManualStructure - объект TreeView, который мы поместили на нашу форму в редакторе Monodevelop в GTK#.
Данное дерево в каждом своем элементе будет содержать строку и объект, в который может быть помещено что угодно - это прописано в инициализации переменной manualTree. Отображено же лишь только текстове значение строки - это прописано в верхней части кода, и прописано в добавлении колонки в отображаемую таблицу Tree View GTK#.
Получение данных и TreeView GTK# при двойном щелчке
Теперь нам было бы интересно при двойном щелчке получить доступ к непосредственному объекту, который был выбран этим двойным щелчом.
На примере кода выше по двойному щелчку на кажом из элементов мы хотели бы получать один из объектов класса Parrams, который присоединен к отображаемому объекту.
Для этого добавляем обработкик события OnTVManualStructureRowActivated (TV_ManualStructure, как помним - имя переменной типа Tree View, которое было задано в редакторе MonoDevelop).
protected void OnTVManualStructureRowActivated (object o, Gtk.RowActivatedArgs args)
{
var model = TV_ManualStructure.Model;
TreeIter iter;
model.GetIter (out iter, args.Path);
object val = model.GetValue (iter, 1);
Parrams p = val as Parrams;
if(p != null)
MessageBox.Show(p.seckond);
}
|