You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取排序后Gtk# TreeView的首行数据?

解决Gtk# TreeView获取排序后首行的问题

首先,你遇到的错误是因为迭代器与模型不匹配:_sortedModel.GetIterFirst()返回的迭代器属于排序后的模型(TreeModelSort),如果之后你错误地将这个迭代器传给原始的_store(ListStore)的GetValue方法,就会触发那个断言错误——ListStore无法识别属于其他模型的迭代器。

正确获取排序后首行的方法

你需要全程使用排序后的模型(_sortedModel)来处理迭代器和获取值,而不是原始的ListStore。以下是完整的示例代码:

TreeIter sortedIter;
// 尝试获取排序后列表的首行迭代器
if (_sortedModel.GetIterFirst(out sortedIter))
{
    // 从排序模型中提取对应列的值
    string displayText = (string)_sortedModel.GetValue(sortedIter, (int)Column.Text);
    int sortValue = (int)_sortedModel.GetValue(sortedIter, (int)Column.SortValue);
    ITreeViewChoice selectedChoice = (ITreeViewChoice)_sortedModel.GetValue(sortedIter, (int)Column.Value);
    
    // 这里可以对首行数据进行后续处理
    Console.WriteLine($"排序后首行文本:{displayText}");
}

额外优化建议

你当前代码中自定义的SortFunc其实是冗余的:因为你已经指定了排序列是SortValue(int类型),Gtk#默认会对int类型的列使用正确的数值排序逻辑,和你写的自定义比较逻辑完全一致。所以可以删除这一行代码,简化实现:

// 保留这一行即可,无需自定义SortFunc
_sortedModel.SetSortColumnId((int) Column.SortValue, SortType.Descending);
// 移除下面这行冗余代码
// _sortedModel.SetSortFunc((int) Column.SortValue, (model, a, b) => { ... });

为什么_store.GetIterFirst得到的是未排序的行?

这是正常行为:_store是原始的ListStore,它保存的是你插入数据的原始顺序,不会受到TreeModelSort的排序影响。只有通过_sortedModel获取的迭代器,才会遵循你设置的排序规则。


内容的提问来源于stack exchange,提问作者JPGInc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:16