如何获取排序后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
相关产品推荐
相关产品推荐

