Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何设置foreach循环在控件面板中循环的顺序?_C#_Winforms - Fatal编程技术网

C# 如何设置foreach循环在控件面板中循环的顺序?

C# 如何设置foreach循环在控件面板中循环的顺序?,c#,winforms,C#,Winforms,我有一个foreach循环,它通过一个控制面板: foreach(MyControl control in MyPanel.Controls) 并将选中的每个复选框控件的名称添加到列表中: if (control.Checked == true) { MyList.Add(control.Name) } 但它似乎在面板上跳跃,按照它将它们添加到列表中的顺序。如何设置它在面板中运行的顺序,以便它以指定的顺序将选中的控件的名称添加到MyList中?MyPanel.controls返回Cont

我有一个foreach循环,它通过一个控制面板:

foreach(MyControl control in MyPanel.Controls)
并将选中的每个复选框控件的名称添加到列表中:

if (control.Checked == true)
{
  MyList.Add(control.Name)
}

但它似乎在面板上跳跃,按照它将它们添加到列表中的顺序。如何设置它在面板中运行的顺序,以便它以指定的顺序将选中的控件的名称添加到MyList中?

MyPanel.controls返回ControlCollection。ControlCollection实现IList接口,因此您可以使用LINQ对其进行排序。

MyPanel.Controls返回ControlCollection。ControlCollection实现IList接口,因此您可以使用LINQ对其进行排序。

将集合强制转换为
IEnumerable
并使用
OrderBy

foreach(MyControl control in MyPanel.Controls.Cast<Control>.OrderBy(c => c.Name))
{
    if (control.Checked == true)
    {
        MyList.Add(control.Name)
    }
}

将集合强制转换为
IEnumerable
并使用
OrderBy

foreach(MyControl control in MyPanel.Controls.Cast<Control>.OrderBy(c => c.Name))
{
    if (control.Checked == true)
    {
        MyList.Add(control.Name)
    }
}

您可以使用Linq创建列表

var MyList = MyPanel.Controls.Cast<Control>.OrderBy(c => c.Name).Where(c=>c.Checked).ToList();
var MyList=MyPanel.Controls.Cast.OrderBy(c=>c.Name).Where(c=>c.Checked.ToList();

您可以使用Linq创建列表

var MyList = MyPanel.Controls.Cast<Control>.OrderBy(c => c.Name).Where(c=>c.Checked).ToList();
var MyList=MyPanel.Controls.Cast.OrderBy(c=>c.Name).Where(c=>c.Checked.ToList();
试试这个:

var MyList = MyPanel.Controls.OfType<CheckBox>()
              .Where(c => c.Checked)
              .OrderBy(c => c.Name)
              .ToList();
var MyList=MyPanel.Controls.OfType()
.其中(c=>c.选中)
.OrderBy(c=>c.Name)
.ToList();
正如您可能看到的,我使用的是类型的
而不是类型的
Cast
,因为如果不能将Cast转换为复选框,Cast将抛出,而类型的
将只返回可以转换为所需类型的对象

干杯

试试这个:

var MyList = MyPanel.Controls.OfType<CheckBox>()
              .Where(c => c.Checked)
              .OrderBy(c => c.Name)
              .ToList();
var MyList=MyPanel.Controls.OfType()
.其中(c=>c.选中)
.OrderBy(c=>c.Name)
.ToList();
正如您可能看到的,我使用的是类型的
而不是类型的
Cast
,因为如果不能将Cast转换为复选框,Cast将抛出,而类型的
将只返回可以转换为所需类型的对象


干杯

它按Controls集合中每个控件的顺序添加。你想要哪个订单?我想能够编辑它添加它们的订单。。。如何将其从添加控件QQQ然后添加控件RRR更改为添加控件RRR然后添加控件QQQ唯一的方法是删除它们并按您想要的顺序将它们重新添加到设计器中。更简单的方法是将控件复制到一个数组中,并按某种方式进行排序,如选项卡索引或
标记
属性。它按控件集合中每个控件的顺序进行添加。你想要哪个订单?我想能够编辑它添加它们的订单。。。如何将其从添加控件QQQ然后添加控件RRR更改为添加控件RRR然后添加控件QQQ唯一的方法是删除它们并按您想要的顺序将它们重新添加到设计器中。更简单的方法是将控件复制到数组中,并按某种方式进行排序,如选项卡索引或
标记
属性。从技术上讲,您可以使用LINQ查询列表并将排序结果存储在单独的列表中,它实际上不会对源
IList
进行排序。从技术上讲,您可以使用LINQ查询列表并将排序结果存储在单独的列表中,它实际上不会对源
IList
进行排序。我从喜欢这个答案开始,然后我意识到
Checked
属性只对CheckBox对象有效,因此,对
控件进行强制转换将不起作用。此外,您应该在排序之前进行筛选。请参阅下面的答案。我开始喜欢这个答案,然后我意识到,
Checked
属性只对CheckBox对象有效,因此强制转换到
控件
将不起作用。此外,您应该在排序之前进行筛选。见下面我的答案。