C# 以每行3个为一组定位标签和文本框的算法

C# 以每行3个为一组定位标签和文本框的算法,c#,winforms,controls,alignment,C#,Winforms,Controls,Alignment,根据XML文件的内容,程序必须在运行时动态创建文本框和标签。我希望在groupbox中按如下方式组织此控件: [label1] [textbox1] [label2] [texbox2] [label3] [textbox] [label4] [textbox4] [label5] [textbox5] [...] 等等 //list the disiciplanas from XML file //into combobox control.

根据XML文件的内容,程序必须在运行时动态创建文本框和标签。我希望在groupbox中按如下方式组织此控件:

[label1] [textbox1]  [label2] [texbox2] [label3] [textbox]
[label4] [textbox4]  [label5] [textbox5] [...]
等等

       //list the disiciplanas from XML file
            //into combobox control.
            for (int i = 0,
                label_X = 20, label_Y = 20,
                textbox_X = 74, textbox_Y = 20,
                len = materias[0].ChildNodes.Count,
                line = 0, tmp_pos = 20;

                i < len;

                i++,
                tab_index++,
                line++,
                tmp_pos += 20
                )
            {
                XmlNode materia = materias[0].ChildNodes[i];
                Point label_position, textbox_position;
                Label label = new Label();
                TextBox textbox = new TextBox();

#if DEBUG_
                if (line == 3)
                {
                    label_X = 200 + tmp_pos;
                    label_Y = 25 + tmp_pos;
                }
                else
                {
                    label_X += 10;
                }

                textbox_Y = label_Y;

#else
                label_Y += 20;
                textbox_Y = label_Y;
#endif

                label.Text = "foo";

                textbox.Size = new Size(48, 20);
                textbox.Name = String.Format("nota{0}", fo.Name);

                label_position = new Point();
                label_position.X = label_X;
                label_position.Y = label_Y;

                textbox_position = new Point();
                textbox_position.X = textbox_X;
                textbox_position.Y = textbox_Y;

                label.Location = label_position;
                textbox.Location = textbox_position;
                textbox.Left = 150;
                textbox.TabIndex = tab_index;

                notas_panel.Controls.Add(label);
                notas_panel.Controls.Add(textbox);
            }
但是我不知道如何计算
X
Y
值。我尝试过几种解决方案,但没有成功。下面是我当前的实现,它将标签和文本框放在每行中:

[label1] [texbox1]
[labe2] [texbox2] 
等等

       //list the disiciplanas from XML file
            //into combobox control.
            for (int i = 0,
                label_X = 20, label_Y = 20,
                textbox_X = 74, textbox_Y = 20,
                len = materias[0].ChildNodes.Count,
                line = 0, tmp_pos = 20;

                i < len;

                i++,
                tab_index++,
                line++,
                tmp_pos += 20
                )
            {
                XmlNode materia = materias[0].ChildNodes[i];
                Point label_position, textbox_position;
                Label label = new Label();
                TextBox textbox = new TextBox();

#if DEBUG_
                if (line == 3)
                {
                    label_X = 200 + tmp_pos;
                    label_Y = 25 + tmp_pos;
                }
                else
                {
                    label_X += 10;
                }

                textbox_Y = label_Y;

#else
                label_Y += 20;
                textbox_Y = label_Y;
#endif

                label.Text = "foo";

                textbox.Size = new Size(48, 20);
                textbox.Name = String.Format("nota{0}", fo.Name);

                label_position = new Point();
                label_position.X = label_X;
                label_position.Y = label_Y;

                textbox_position = new Point();
                textbox_position.X = textbox_X;
                textbox_position.Y = textbox_Y;

                label.Location = label_position;
                textbox.Location = textbox_position;
                textbox.Left = 150;
                textbox.TabIndex = tab_index;

                notas_panel.Controls.Add(label);
                notas_panel.Controls.Add(textbox);
            }
//列出XML文件中的disiciplanas
//进入组合框控件。
对于(int i=0,
标签X=20,标签Y=20,
文本框X=74,文本框Y=20,
len=Materials[0]。ChildNodes.Count,
直线=0,tmp_位置=20;
i

我希望这是清楚的。提前感谢

最简单的方法就是不要计算它们

创建一个面板并去掉它的边框。在面板上创建动态控件,并将面板设置为Dock Top,然后在面板上调用
BringToFront()
(或者可以是
SendToBack()
,我永远记不起它们在运行时以何种方式帮助停靠)

创建下一个批次时,所有控件都具有相同的位置,但它们的父面板会自动放置在前一个批次的下方

结果应该如下所示:

公共部分类表单1:表单
{
列出儿童名单;
公共表格1()
{
初始化组件();
Children=新列表();
AddRange(可枚举的范围(0,20));
ShowChildren();
}
私家子女()
{
对于(int i=0;i
最简单的方法是不要计算它们

创建一个面板并去掉它的边框。在面板上创建动态控件,并将面板设置为Dock Top,然后在面板上调用
BringToFront()
(或者可以是
SendToBack()
,我永远记不起它们在运行时以何种方式帮助停靠)

创建下一个批次时,所有控件都具有相同的位置,但它们的父面板会自动放置在前一个批次的下方

结果应该如下所示:

公共部分类表单1:表单
{
列出儿童名单;
公共表格1()
{
初始化组件();
Children=新列表();
AddRange(可枚举的范围(0,20));
ShowChildren();
}
私家子女()
{
对于(int i=0;ipublic IEnumerable<Point> GetLocations(int numCols,int colWidth,int rowHeight)
{
    int x = 0, y = 0;
    while (true)
    {
        for (int i = 0; i < numCols; i++)
        {
            yield return new Point(x, y);
            x += colWidth;
        }
        x = 0;
        y += rowHeight;
    }
}
foreach (Point p in GetLocations(3, 100, 32).Take(12))
{
    Console.WriteLine(p);
}