2012-03-20 6 views
1

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

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

Моя проблема: как добавить эти RootNodes в 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; 
} 

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

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

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

+0

у вас есть некоторый код до сих пор показать нам? – IanNorton

ответ

2

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

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); 
} 

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

+0

Спасибо, я знаю и уже использовал его таким образом. Мой TreeStore имеет тип Song, и я использую TreeCellDataFunc. вот мой код: – Chris

+0

Спасибо. Это работает именно так. Это Gtk.TreeStore (typeof (string), typeof (string)), но я бы предпочел использовать typeof (Song), потому что у меня есть несколько столбцов, подключенных к TreeCellDataFunc, и я делаю кучу других вещей. Подобно настройке pixbuf, изменению цвета, вычеркиванию и т. Д. Так что все это делается внутри моего TreeCellDataFunc. Это классно, потому что мне не нужно строить весь Treestore самостоятельно. Так что в основном я спрашивал, есть ли удобный способ с использованием typeof (Song) и отображать данные по иерархии – Chris

0
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; 
} 

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

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

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

+0

Это не ответ, его редактирование на ваш вопрос – IanNorton

+0

Да, я как-то испортил это. У вас есть какие-то намеки, как я могу достичь этого, используя TreeStore? – Chris

+0

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

Смежные вопросы