C#选择分类的按字母顺序排序的属性网格中的第一行
本文关键字:一行 网格 排序 分类 选择 顺序 属性 | 更新日期: 2023-09-27 18:00:51
我已经加载了已分类的PropertySpec的PropertyGrid,并将其设置为已分类的字母排序。当表单运行类别时,类别中的项目将被排序。一个令人讨厌的问题是,PropertyGrid默认情况下会在列表排序后选择第一个项目,有时还会将视图滚动到所选内容。若项目列表很长,您最终会看到列表滚动到在中间的某个位置。
由于PropertySpec可以在运行时创建,所以我希望在表单加载时始终显示列表的顶部。PropertyGrid不"容易"公开集合,当然也不按顺序公开。谷歌搜索后我被引导相信这是不可能的?
我想出了下面的代码,但事实并非如此。
代码段将选择排序列表的第一个类别。也可以选择该类别中的第一个项目来扩展方法,但出于我的需要,这是不必要的。
// bind the PropertyTable to PropertyGrid
this.pg_Prefs.SelectedObject = proptable;
// get selected item
GridItem gi = this.pg_Prefs.SelectedGridItem;
// get category for selected item
GridItem pgi = gi.Parent.Parent;
//sort categories
List<GridItem> sortedCats = new List<GridItem>(pgi.GridItems.Cast<GridItem>());
sortedCats.Sort(delegate(GridItem gi1, GridItem gi2) { return gi1.Label.CompareTo(gi2.Label); });
// loop to first category
for (int i = 0; i < pgi.GridItems.Count; i++)
{
if (pgi.GridItems[i] == gi) break; // in case full circle done
// select if first category
if (pgi.GridItems[i].Label == sortedCats[0].Label)
{
pgi.GridItems[i].Select();
break;
}
}
希望这也能帮助其他人。
对列表进行排序后,实际选择类别的简化方法是sortedCats[0].Select();
,而不是循环遍历和检查每个项目。如果你想使用快捷方式,你必须断言列表不是空的,但这会提高一些性能。。。