我对FlowLayoutPanels添加到表单的 controls 属性的顺序有一个特殊的问题。这就是我试过的,
我在垂直条带中从左到右添加了7个FlowLayoutPanel到C#窗口应用程序。然后我再次从左到右标记流布局为1,2,3,... 7。现在在表单的加载处理程序中,我编写了以下代码段,
foreach (FlowLayoutPanel aDaysControl in this.Controls)
{
MessageBox.Show(aDaysControl.Tag.ToString());
}
我希望邮件按 1,2,... 7 的顺序显示。但我按相反的顺序得到它(7,6,...... 1)。有人可以帮我解决我的错误吗?
保留订单的原因,
我正在尝试制作日历控件 每行代表一天。如果一个 月从星期三开始,然后是我 需要添加一个空标签 第一(周一)和第二(周二) 行。所以顺序有点重要
答案 0 :(得分:7)
我知道这是一个很老的问题,但是......
您可能想要使用SetChildIndex
。例如this.Controls.SetChildIndex(button1, 0);
答案 1 :(得分:3)
查看它们在yourForm.designer.cs中添加到表单的顺序
答案 2 :(得分:1)
如果查看设计器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());
}
答案 3 :(得分:1)
如果将来某些其他设计师删除了控件,添加回来等怎么办?检查设计师总是一团糟。更好的是在枚举之前对容器控件中的控件进行排序。我使用这种扩展方法(如果你有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;
}
你可以:
foreach (FlowLayoutPanel aDaysControl in this.ToControlsSorted())
{
MessageBox.Show(aDaysControl.TabIndex.ToString());
}
(以上是TabIndex
)。根据{{1}}从那里排序是微不足道的。
答案 4 :(得分:0)
真的有问题吗?
只要用户界面正常运行(例如,按照标签顺序),我建议您不要对它们被枚举的顺序做出任何假设。
编辑:感谢您更详细地解释您的要求。我想我仍然建议不要使用它们存储在Controls集合中的顺序。最好将这些实现细节视为“不透明”。您有一个与每个控件关联的标记,因此您可以使用它来标识正确的控件。为了加快处理速度,您可以构建一个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;
虽然我会进行一些类型检查,以使这段代码更加健壮!