У меня есть Gtk # TreeView с одним видимым столбцом, модель которого содержит 3 значения (текст для видимого столбца, значение для сортировки дерева и ссылку на базовый объект). Вот код:
internal class JpgTreeView : TreeView
{
private readonly ListStore _store = new ListStore(typeof(string), typeof(int), typeof(ITreeViewChoice));
private TreeModelSort _sortedModel;
private enum Column
{
Text,
SortValue,
Value
}
public JpgTreeView()
{
var valueColumn = new TreeViewColumn();
AppendColumn(valueColumn);
var visisbleColumnTextRenderer = new CellRendererText();
valueColumn.PackStart(visisbleColumnTextRenderer, true);
valueColumn.AddAttribute(visisbleColumnTextRenderer, "text", (int) Column.Text);
_sortedModel = new TreeModelSort(_store);
_sortedModel.SetSortColumnId((int) Column.SortValue, SortType.Descending);
_sortedModel.SetSortFunc((int) Column.SortValue, (model, a, b) =>
{
var aval = (int) model.GetValue(a, (int) Column.SortValue);
var bval = (int) model.GetValue(b, (int) Column.SortValue);
return aval.CompareTo(bval);
});
Model = _sortedModel;
}
Сортировка работает правильно, но функция _store.GetIterFirst всегда извлекает исходную первую строку (то есть первую строку несортированного списка). _sortedModel.GetIterFirst возвращает следующее сообщение об ошибке:
gtk_list_store_get_value: assertion 'iter_is_valid (iter, list_store)' failed
Я заполняю TreeView с помощью этой функции:
public void SetChoices(IEnumerable<ITreeViewChoice> choices)
{
_store.Clear();
foreach (var choice in choices)
{
_store.AppendValues(choice.GetChoiceText(), 1, choice);
}
}
Как мне получить первую строку отсортированного списка?
Ваш класс JpgTreeView сбивает с толку. Он наследуется от TreeView, поэтому должен быть TreeView. Но у вас есть список. В вашем примере древовидное представление, похоже, не связано со списком.
Я обновил его, чтобы использовать TreeStore. Вот ссылка на проект: github.com/jpginc/JPGTree/blob/…
Теперь я вижу свою ошибку. Я запутался между TreeStore и TreeModelSort. Получение строки из TreeModelSort работает правильно, но я пытался извлечь значение строки TreeModelSort с помощью TreeStore, что недопустимо. Я добавлю ответ





_sortedModel.GetIterFirst - это правильный способ получить первую строку упорядоченного Gtk TreeView (TreeModelSort)
Проблема, с которой я столкнулся, заключалась в том, что я использовал строку, возвращаемую из TreeModelSort в ListStore, которая недействительна. т.е. это правильно:
_sortedModel.GetIterFirst(out var iter);
var value = _sortedModel.GetValue(iter, (int) Column.Value);
И это неправильно (что я делал):
_sortedModel.GetIterFirst(out var iter);
var value = _store.GetValue(iter, (int) Column.Value);
Можете ли вы привести полный пример?
GetIterFirst()возвращает логическое значение, проверьте это значение. Вы случайно инициализируете iter до того, как liststore будет заполнен значениями?