C# 在FlowLayoutpanel内订购控件

C# 在FlowLayoutpanel内订购控件,c#,.net,user-controls,flowlayoutpanel,C#,.net,User Controls,Flowlayoutpanel,我有一个Windows.Forms.FlowLayoutPanel,它在运行时由MasterMeter类型的控件(以及从MasterMeter继承的控件)填充。这是您的标准Usercontrol。每个控件都有一个属性ErrorTime。此值保留当前错误或警报的持续时间 Datetime? ErrorTime {get; set;} 我目前正试图使用bubblesort方法根据错误持续时间(递减)对控件进行排序。现在我想知道是否有一种更快/更高效/更可靠的方法来实现这一点 如果没有,我是否可以

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

 Datetime? ErrorTime {get; set;}
我目前正试图使用
bubblesort方法根据错误持续时间(递减)对控件进行排序。现在我想知道是否有一种更快/更高效/更可靠的方法来实现这一点

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

  • 项目数量可能会有所不同
  • 运行时的项目数量可能从0更改为100(以前从未出现过超过100个错误…)
  • 必须能够包含用户控件
当前代码(不会排序)

我使用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 }
                          };
我的泡泡排序如下所示:

        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;
                }
            }
        }

但我的数组仍然没有排序。这里出了什么问题?

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

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

至于对FlowLayoutPanel中的控件重新排序,您的帖子中缺少该代码,但一般来说,您会使用
FlowLayoutPanel.controls.SetChildIndex
方法对控件重新排序。

您应该显示排序代码。完成!thnx的帮助这就是为什么我正在寻找一个替代泡泡运动的原因。我可以将空值设置为
DateTime.MinValue
,但我不相信这是正确的选择。你的代码给了我一个想法。我可以过滤掉
null
值并将它们设置到第一个位置。
if (!meterList[inner].ErrorTime.HasValue || 
    meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime) {