在 FlowLayoutpanel 中排序控件

问题描述 投票:0回答:2

我有一个

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

 Datetime? ErrorTime {get; set;}

我目前正在尝试根据错误的持续时间(降序)使用

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();

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

c# .net user-controls flowlayoutpanel
2个回答
1
投票

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

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

就重新排序 FlowLayoutPanel 中的控件而言,您的帖子中缺少该代码,但一般来说,您可以使用

FlowLayoutPanel.Controls.SetChildIndex
方法来重新排序控件。


0
投票

我刚刚读到这篇文章,我不确定答案是否真的令人信服,我们可以悄悄打赌,未来十年内很多人将拥有在 FlowLayoutPanels 中进行排序的控件。

我遇到了 FlowLayoutPanel 未按我想要的顺序显示控件的问题。

当我在每次修改时清除控件时,在从 TableAdapter 再次加载它们(到 DataSet)之前,我所要做的就是更正 TableAdapter 的查询,以便它按照我想要的顺序填充 DataSet。

然后,FlowLayoutPanel的控件按照DataSet的顺序加载。

在这里的提案中,我看到了 SetChildIndex :这意味着您必须浏览 FlowLayoutPanel 中的控件集合,并为每个控件提供您想要的索引。

同时操作两者并比较所需的时间会很有趣。但有一点没有说:当避免清除控件以再次填充它们时,使用什么方法来确定每个控件的索引。

在这种情况下,我想你必须注意你的代码是可读的。

© www.soinside.com 2019 - 2024. All rights reserved.