2

フィルタリングされてから並べ替えられたListStoreがあります。これは次のようになります。

// Create a model for the cards
cardListStore = new ListStore (typeof (Card));

// Set up the tree view
cardFilter = new TreeModelFilter (cardListStore, null);
cardFilter.VisibleFunc = new TreeModelFilterVisibleFunc (FilterCards);
cardSort = new TreeModelSort (cardFilter);
cardTreeView.Model = cardSort;

行を右クリックしたときに、各行に固有のコンテキストメニューを取得したいと思います。私のクリックハンドラーは次のようになります。

[GLib.ConnectBeforeAttribute]
void HandleCardTreeViewButtonPressEvent (object o, ButtonPressEventArgs args)
{
    if (args.Event.Button != 3)
        return;

    TreePath path;
    // If right click on empty space
    if (!cardTreeView.GetPathAtPos (Convert.ToInt32 (args.Event.X),
                                    Convert.ToInt32 (args.Event.Y),
                                    out path)) {
        MakeCardEmptySpaceContextMenu ().Popup ();
        return;
    }

    TreeIter iter;
    if (!cardListStore.GetIter (out iter, path))
        return;

    Card card = (Card) cardListStore.GetValue (iter, 0);

    MakeCardContextMenu (card, iter).Popup ();
}

これは、ListStoreがフィルタリングまたはソートされていない場合に機能します。しかし、そうである場合、それは間違った行を与えます。

たとえば、並べ替える前の行が次のようになっているとします。

A
B
C

そして、それらがソートされた後、それらは次のようになります。

B
A
C

2番目の行(「A」)を右クリックすると「B」が表示されます。これは、モデルが並べ替えられる前のBの場所であるためです。フィルタリングについても同じことが起こります。フィルタリングされた後のモデルは、次のようになります。

A
C

2番目の行(「C」)を右クリックすると、「B」が表示されます。

これを回避する方法はありますか?

4

2 に答える 2

2

cardListStore の代わりに、cardSort から iter と値を取得する必要がありました。

if (!cardListStore.GetIter (out iter, path))
    return;

Card card = (Card) cardListStore.GetValue (iter, 0);

になる

if (!cardSort.GetIter (out iter, path))
    return;

Card card = (Card) cardSort.GetValue (iter, 0);
于 2010-02-10T14:23:04.807 に答える
0

あなたとデータの間にフィルターがあるように見えます、そしてそれはツリーによって表示されるものです。あなたは木の後ろのデータを見ています...

今、私はGTKに精通していませんが、おそらく次のようなものです

TreeModelSort.convert_path_to_child_path ?

表示しているモデルのビューのどの行を取得し、それを実際のモデルデータに変換する方法を賭ける必要があります。

于 2010-02-10T00:28:54.270 に答える