C# C中窗体控件属性中控件的顺序
我对FlowLayoutPanels添加到表单控件属性的顺序有一个特殊的问题。这就是我试过的 我在一个C窗口应用程序中添加了7个FlowLayoutPanels,从左到右为垂直条带。然后我将流布局标记为1、2、3。。。7再次从左到右。现在在表单的加载处理程序中,我编写了以下代码段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
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());
}