如何对控件类型列表进行排序

Posted

技术标签:

【中文标题】如何对控件类型列表进行排序【英文标题】:How to sort list of Control type 【发布时间】:2021-12-12 23:54:09 【问题描述】:

我在这样的表单上创建了控件列表:

            List<Control> list = new List<Control>();
            foreach (Control c in this.Controls)
            
                if (c.GetType() == typeof(Label))
                
                    list.Add(c);
                
            

这个列表中的所有控件都是标签,所以我需要对这个Controls列表进行升序排序,所以我使用List类的Sort方法如下:

list.Sort();

但它告诉我System.InvalidOperationException: 'Failed to compare two elements in the array.' ArgumentException: At least one object must implement IComparable.

由于我想使用TabIndex 值或至少它的Name 对其进行排序,所以我不清楚。我应该将什么传递给Sort 方法,或者我应该使用什么来代替这个方法?

【问题讨论】:

var labels = this.Controls.OfType&lt;Label&gt;().OrderBy(L =&gt; L.TabIndex); 【参考方案1】:

您可以使用IEnumerable interface method of OrderBy 并为其提供一个函数,该函数指定您要比较的元素作为使用排序的替代方法。

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program

    public static void Main()
    
        var controls = new List<B>() new B() Index = 0, new B() Index = -1;
        var sortedControls = controls.OrderBy(x => x.Index).ToList();
        Console.WriteLine(controls[0].Index); // -1
        Console.WriteLine(controls[1].Index); // 0
    


public class B

    public int Index get; set;

【讨论】:

【参考方案2】:

您可以将Comparison 函数传递给list.Sort

var list = this.Controls.OfType<Label>().ToList();
list.Sort((a, b) => a.TabIndex.CompareTo(b.TabIndex));

【讨论】:

以上是关于如何对控件类型列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

MFC控件之Combo Box

如何按整数属性对类列表进行排序? [复制]

对ListBox控件中的数据进行排序

WindowsGUI自动化测试框架搭建-控件定位工具和使用方法

WPF中常用的表格控件都有哪些

PyQt5窗口设计基础之常用控件类(三)