获取有序 Gtk TreeView 的第一行(Gtk#)
Get first row of an ordered Gtk TreeView(Gtk#)
我有一个带有一个可见列的 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
returns 错误信息如下:
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);
}
}
如何获取排序列表的第一行?
_sortedModel.GetIterFirst
是检索有序 Gtk TreeView (TreeModelSort) 的第一行的正确方法
我遇到的问题是我在 ListStore 中使用了从 TreeModelSort 返回的无效行。即这是正确的:
_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);
我有一个带有一个可见列的 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
returns 错误信息如下:
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);
}
}
如何获取排序列表的第一行?
_sortedModel.GetIterFirst
是检索有序 Gtk TreeView (TreeModelSort) 的第一行的正确方法
我遇到的问题是我在 ListStore 中使用了从 TreeModelSort 返回的无效行。即这是正确的:
_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);