GTK # TreeView иерархическое отображение данных - PullRequest
1 голос
/ 20 марта 2012

В настоящее время я работаю с mono и gtk #. Относительно TreeView есть это Tutorial . Я хочу добиться того же, что представлено в разделе «Управление использованием модели» Итак, у меня есть класс песни и методы визуализации для отображения исполнителя и заголовка.

Но я хочу отобразить его через TreeStore вместо ListStore. Чтобы у меня был Rootnode для каждой буквы, и под этим узлом должны отображаться все исполнители, начинающиеся с этой буквы.

Моя проблема, как я могу добавить эти RootNode в TreeStore? И куда мне их добавить?

songs.Add(new Song("Dancing Djs vs. Roxette", "Fading like a flower"));
songs.Add(new Song("Xaiver","give me the right"));
songs.Add(new Song("Daft Punkt","Technologic"));

TreeStore musicListStore = new TreeStore(typeof(Song));
foreach (var s in songs) 
{
    musicListStore.AppendValues(s);
}

treeview1.Model = musicListStore;

treeview1.AppendColumn("Artist", new CellRendererText(),new TreeCellDataFunc(RenderArtistName));
treeview1.AppendColumn("Title", new CellRendererText(),new TreeCellDataFunc(RenderSongTitle));

private void RenderArtistName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
    Song s = model.GetValue(iter,0) as Song;
    (cell as CellRendererText).Text = s.Artist;
}

private void RenderSongTitle(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
    Song s = model.GetValue(iter,0) as Song;
    (cell as CellRendererText).Text = s.Title;
}

Итак, я хочу добиться, чтобы для каждой буквы были корневые узлы, а под каждой буквой должны быть перечислены все исполнители, начинающиеся с этой буквы.

Моя проблема в том, как добавить букву в TreeStore, а также как узнать, куда вставить каждую песню.

Вот снимок экрана, на котором я хотел бы, чтобы он выглядел (мне не разрешено загружать их напрямую. Поэтому я должен был использовать внешний хостинг. Sry): Скриншот

1 Ответ

2 голосов
/ 21 марта 2012

Вы можете построить свое дерево довольно легко. Например,

var store = new Gtk.TreeStore( typeof(string) );

// add a root node
var root = store.AppendValues("hello"); 

// add a child of the root
store.AppendValues(root,"world");

// add another child
var mono = store.AppendValues(root,"mono");

// add a second level child
store.AppendValues(mono,"gtk");

Итак, в контексте вашего музыкального приложения ..

// title, artist
var store = new Gtk.TreeStore( typeof(string), typeof(string) );

// make an index of top level nodes using thier TreeIters
var index = new Dictionary<string,Gtk.TreeIter>();

// add index nodes
foreach ( var letter in new List<string>{ "A", "B", "C" ... "Z" } ){
    index[letter.ToLower()] = store.AppendValues( letter );
}

// add songs
foreach ( var song in songlist ){
    var title = song.Title;
    var artist = song.Artist;

    var first = title.SubString(0,1).ToLower();
    var iter = store[first];

    // add this song
    store.AppendValues( iter, title, artist );
}

Вам придется проделать дополнительную работу, если вы хотите динамически добавлять узлы индекса, каждый раз, когда вы добавляете узел на уровне, все значения древовидной структуры на этом уровне или глубже становятся бесполезными.

...