重写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()方法,但他的问题不清楚,似乎刚刚"消失",他随机选择的答案是不理想的,甚至可编译由于不可访问的保护级别)

重写winform 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没有任何内置的集合类型支持绑定和本质上排序。