C# C中窗体控件属性中控件的顺序

C# C中窗体控件属性中控件的顺序,c#,winforms,user-interface,controls,C#,Winforms,User Interface,Controls,我对FlowLayoutPanels添加到表单控件属性的顺序有一个特殊的问题。这就是我试过的 我在一个C窗口应用程序中添加了7个FlowLayoutPanels,从左到右为垂直条带。然后我将流布局标记为1、2、3。。。7再次从左到右。现在在表单的加载处理程序中,我编写了以下代码段 foreach (FlowLayoutPanel aDaysControl in this.Controls) { MessageBox.Show(aDaysControl.Tag.To

我对FlowLayoutPanels添加到表单控件属性的顺序有一个特殊的问题。这就是我试过的

我在一个C窗口应用程序中添加了7个FlowLayoutPanels,从左到右为垂直条带。然后我将流布局标记为1、2、3。。。7再次从左到右。现在在表单的加载处理程序中,我编写了以下代码段

    foreach (FlowLayoutPanel aDaysControl in this.Controls)
    {
        MessageBox.Show(aDaysControl.Tag.ToString());
    }
我希望消息以1,2。。。7.但我得到的是相反的顺序7,6,…1。有人能帮我解决我犯的错误吗

维护秩序的原因,


我正在尝试制作一个日历控件 每行代表一天。如果 这个月从星期三开始,然后我 需要将空标签添加到 第一个星期一和第二个星期二 一行所以顺序有点重要


看看它们在yourForm.designer.cs中添加到表单的顺序,这真的是个问题吗

例如,只要UI在选项卡顺序方面正确运行,我建议您不要对它们的枚举顺序进行任何假设

编辑:感谢您更详细地解释您的需求。我想我还是建议不要使用它们存储在控件集合中的顺序。最好将这些实现细节视为“不透明”。您有一个与每个控件关联的标记,因此可以使用它来标识正确的控件。为了加快处理速度,您可以构建一个按顺序引用控件的7元素数组:

FlowLayoutPanel[] panels = new FlowLayoutPanel[7];

foreach(FlowLayoutPanel panel in this.Controls)
{
    panels[(int)panel.Tag] = panel;
}

// Now, you can reference the panels directly by subscript:

panels[2].BackColor = Color.Aquamarine;

尽管我已经加入了一些类型检查,使代码更加健壮

如果您查看设计器Form1.designer.cs生成的代码,它将如下所示:

        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(658, 160);
        this.Controls.Add(this.flowLayoutPanel7);
        this.Controls.Add(this.flowLayoutPanel6);
        this.Controls.Add(this.flowLayoutPanel5);
        this.Controls.Add(this.flowLayoutPanel4);
        this.Controls.Add(this.flowLayoutPanel3);
        this.Controls.Add(this.flowLayoutPanel2);
        this.Controls.Add(this.flowLayoutPanel1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);
请注意它是如何构建的,您先添加了面板1,然后添加了面板2,以此类推。 但是随着代码的运行,它将先添加7,然后再添加6

此代码将位于设计器生成的InitializeComponent函数中

为什么你需要它们按一定的顺序运行

我不会依靠设计师来维持你想要的秩序。。我会自己对控件进行排序:

        var flowpanelinOrder = from n in this.Controls.Cast<Control>()
                               where n is FlowLayoutPanel
                               orderby int.Parse(n.Tag.ToString())
                               select n;

        /* non linq
        List<Control> flowpanelinOrder = new List<Control>();
        foreach (Control c in this.Controls)
        {
            if (c is FlowLayoutPanel) flowpanelinOrder.Add(c);                
        }
        flowpanelinOrder.Sort();
         * */

        foreach (FlowLayoutPanel aDaysControl in flowpanelinOrder)
        {
            MessageBox.Show(aDaysControl.Tag.ToString());
        }

我知道这是一个很老的问题,但是


您可能需要使用SetChildIndex。e、 g.this.Controls.SetChildIndexbutton1,0

如果将来有其他设计师删除了控件,重新添加了控件等,会怎么样?检查设计师总是一团糟。最好是在枚举之前对容器控件中的控件进行排序。如果您有Linq,我将使用此扩展方法:

public static List<Control> ToControlsSorted(this Control panel)
{
    var controls = panel.Controls.OfType<Control>().ToList();
    controls.Sort((c1, c2) => c1.TabIndex.CompareTo(c2.TabIndex));
    return controls;
}

以上是TabIndex。根据标签进行排序很简单。

但是顺序对我来说很重要!!是 啊这就是问题所在。它们是以相反的方式添加的。不知道为什么。ThanksI我正在尝试制作一个日历控件,每行代表一天。如果一个月从星期三开始,那么我需要在第一个星期一和第二个星期二行添加一个空标签。所以顺序有点重要。我有点懒。现在就吸取教训吧。你对我的回答评论说,订单对你很重要。我很想知道为什么。你能修改一下你的问题来解释原因吗?谢谢
foreach (FlowLayoutPanel aDaysControl in this.ToControlsSorted())
{
    MessageBox.Show(aDaysControl.TabIndex.ToString());
}