В Gtk # почему VALID_ITER может завершиться ошибкой даже после того, как я проверил его с помощью IterIsValid? - PullRequest
1 голос
/ 14 марта 2010

В моем TreeView есть вспомогательная функция, которая выглядит примерно так:

Card GetCardFromPath (TreePath path)
{
    TreeIter iter;
    if (path == null || !Model.GetIter (out iter, path))
        return null;

    if ((Model as TreeModelSort).IterIsValid (iter))
        return (Card) Model.GetValue (iter, 0);

    return null;
}

В большинстве случаев это работает без ошибок. Но когда он вызывается непосредственно после изменения модели, строка 8 дает мне следующие ошибки времени выполнения Gtk:

[Fatal 16:53:02.448] [Gtk] gtk_list_store_get_value: assertion `VALID_ITER (iter, list_store)' failed
[Fatal 16:53:02.449] [GLib-GObject] g_value_unset: assertion `G_IS_VALUE (value)' failed

Насколько я могу судить, мне даже не нужно проверять IterIsValid, потому что я уже проверяю возвращаемое значение Model.GetIter. Тем не менее, как VALID_ITER может потерпеть неудачу в функции, которая вызывается, только если IterIsValid возвращает true?

Если это имеет значение, модель представляет собой TreeModelSort, которая сортирует TreeModelFilter, которая фильтрует ListStore. Ошибка возникает, когда GetCardFromPath вызывается из HandleSelectionChanged, когда из ListStore было только что удалено несколько строк. Похоже, что это не мешает работать должным образом, но наличие каскада ошибок при удалении нескольких строк на самом деле не идеально.

...