重写winform ListBox.Sort()未按预期调用
本文关键字:调用 winform ListBox Sort 重写 | 更新日期: 2023-09-27 17:52:37
我试图在列表框中重写排序方法以降序排序。
代码:public CustomSortListBox()
: base()
{
}
protected override void Sort()
{
if (this.Items.Count > 1)
{
bool swapped;
do
{
int counter = this.Items.Count - 1;
swapped = false;
while (counter > 0)
{
// set this to != to reverse sorting
if (this.Items[counter].ToString().CompareTo(this.Items[counter - 1].ToString()) != -1)
{
object temp = Items[counter];
this.Items[counter] = this.Items[counter - 1];
this.Items[counter - 1] = temp;
swapped = true;
}
counter -= 1;
}
}
while (swapped);
}
}
现在,我直观地期望这个方法将被调用,每当项目被添加到列表中,这似乎是它是如何工作的基本ListBox当ListBox。排序= true。然而,在将项目添加到列表后使用我的CustomSortListBox,我的自定义排序没有得到尊重,而且,当更改项目列表时,重写的方法没有被调用,甚至没有击中断点。
然后我读了这个https://gfaraj.wordpress.com/2008/07/31/custom-sorting-for-listbox-in-c/,它说"不要忘记排序只在排序属性从false变为true时调用"这对我来说似乎很荒谬,但果然,当切换排序关闭和重新打开时,我的自定义排序被调用并工作。
有趣的是,在此之后,留下Sorted = true,使用基本Sort()方法对添加的新项进行排序,创建升序和降序的混合项。直到您再次切换排序false -> true。我甚至会满足于把Sorted = false;Sorted = true;在ItemsChanged的事件处理程序中,但这样的事件不存在。
我做错了什么,我怎么能使这个排序重写被尊重,当列表被添加到?
(我已经看到c# 's ListBox没有'看到我覆盖的Sort()方法,但他的问题不清楚,似乎刚刚"消失",他随机选择的答案是不理想的,甚至可编译由于不可访问的保护级别)
似乎您理解要调用Sort()
方法,ListBox.Sorted
属性需要过渡到true
。这是有记录的,虽然很少。据我所知,这是唯一一次调用Sort()
方法,这种理解与文档一致。
有趣的是,在此之后,留下Sorted = true,使用基本Sort()方法对添加的新项进行排序,创建升序和降序的混合项。直到您再次切换排序false -> true。
当您向ListBox
添加项时,顺序不是由Sort()
方法处理,而是由控件的集合对象处理。该对象执行二进制搜索以找到插入新项的正确位置。不幸的是,在列表框项文本上使用字符串比较是硬编码的。
这就是为什么添加项会导致它们按照默认实现排序。但是它并没有使用"the base Sort()
method"来完成它。
对于Winforms ListBox
类,如果您希望有效地对项目进行排序,最好的选择可能是不重写Sort()
或使用Sorted
属性。相反,应该提供一个辅助方法来添加新项,并让该方法对Items
集合进行适当的二进制搜索,以找到插入位置。
无论如何,您都必须实现一个helper方法来获得添加项的通知,并且进行排序插入比每次插入时重新排序整个集合更有效。
你可以(在评论中建议)绑定一个排序的集合到ListBox
,但这将是更多的工作,特别是因为AFAIK没有任何内置的集合类型支持绑定和本质上排序。