【问题标题】:Get first row of an ordered Gtk TreeView(Gtk#)获取有序 Gtk TreeView(Gtk#) 的第一行
【发布时间】:2018-05-09 00:42:44
【问题描述】:

我有一个带有一个可见列的 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);
    }
}

如何获取排序列表的第一行?

【问题讨论】:

  • 你能提供完整的例子吗? GetIterFirst() 方法返回一个布尔值,检查该值。您是否碰巧在 liststore 弹出值之前初始化了 iter?
  • 您的 JpgTreeView 类令人困惑。它继承自TreeView,所以它必须是TreeView。但是你有一个列表存储。从您的示例中,树视图似乎与列表存储无关。
  • 我将其更新为使用 TreeStore。这是该项目的链接:github.com/jpginc/JPGTree/blob/…
  • 我现在明白我的错误了。我对 TreeStore 和 TreeModelSort 感到困惑。从 TreeModelSort 获取行正常工作,但我试图使用无效的 TreeStore 提取 TreeModelSort 行的值。我会添加一个答案

标签: c# gtk gtk#


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多