繁体   English   中英

FlowLayoutpanel内部的订购控件

[英]Ordering Controls inside FlowLayoutpanel

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

 Datetime? ErrorTime {get; set;}

我目前正在尝试根据错误的持续时间(降序)使用bubblesort-method对控件进行bubblesort-method 现在,我想知道是否有更快/更高效/更可靠的方式来做到这一点?

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

  • 项目数量可能会有所不同
  • 运行时的项目数量可能会从0更改为100(以前没有超过100个错误...)
  • 必须能够包含用户控件

当前代码(不会排序)

我正在使用一维数组来保持简单(实际上是锯齿状数组)。 注意: 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();

但是我的数组仍然没有排序。 这是怎么了?

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

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

至于在FlowLayoutPanel中对控件进行重新排序,您的帖子中缺少该代码,但是通常,您将使用FlowLayoutPanel.Controls.SetChildIndex方法对控件进行重新排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM