在FlowLayoutpanel内订购控件

时间:2014-02-20 13:26:09

标签: c# .net user-controls flowlayoutpanel

我有Windows.Forms.FlowLayoutPanel在运行时使用MasterMeter类型的控件(以及从MasterMeter继承的控件)填充。这是您的标准Usercontrol。每个控件都有一个属性ErrorTime。此值保持当前错误或警报的持续时间。

 Datetime? ErrorTime {get; set;}

我目前正在尝试根据错误的持续时间(降序)使用bubblesort-method对控件进行排序。现在我想知道有更快/更高性能/更可靠的方法吗?

如果没有,我可以使用另一个容器吗? 它需要具有以下特征:

  • 项目数量可能会有所不同
  • 运行时的项目数量可能会从0更改为100(在...之前从未超过100个错误)
  • 必须能够包含usercontrols

当前代码(不会排序)

我正在使用1D阵列来保持简单(实际上它是一个锯齿状阵列)。 注意:NULL值的可能性

MasterMeter[] meterList = {new MasterMeter() { ErrorTime = null },
                           new MasterMeter() { ErrorTime = DateTime.Now },
                           new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-10) },
                           new MasterMeter() { ErrorTime = DateTime.Now.AddDays(37) },
                           new MasterMeter() { ErrorTime = DateTime.Now.AddDays(53) },
                           new MasterMeter() { ErrorTime = DateTime.Now.AddDays(3) },
                           new MasterMeter() { ErrorTime = null },
                           new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-17) },
                           new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-10) },
                           new MasterMeter() { ErrorTime = null }
                          };

Bubblesorting如下:

        for (int outer = 0; outer < meterList.Count(); outer++)
        {
            for (int inner = 0; inner < (meterList.Count() - 1); inner++)
            {
                if (meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime)
                {
                    var temp = meterList[inner + 1];
                    meterList[inner + 1] = meterList[inner];
                    meterList[inner] = temp;
                }
            }
        }

我的输出结果(使用Console.Writeline):

        foreach (MasterMeter meterlist in meterList)
        {
            Console.WriteLine(meterlist.ErrorTime);
        }
        Console.ReadLine();

但是我的数组仍未排序。这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

您必须决定如何处理列表中的空值,因为它会干扰您的冒泡排序:

if (!meterList[inner].ErrorTime.HasValue || 
    meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime) {

至于重新排序FlowLayoutPanel中的控件,您的帖子中缺少该代码,但一般情况下,您可以使用FlowLayoutPanel.Controls.SetChildIndex方法重新排序控件。