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) {