C# 使控件集中在TableLayoutPanel中

C# 使控件集中在TableLayoutPanel中,c#,tablelayoutpanel,C#,Tablelayoutpanel,我开始使用C#,并尝试创建一个包含许多不同控件的表单。为了保持简单,我使用了TableLayoutPanel来处理格式设置。但是,我希望所有控件都集中在各自的单元中。经过一些搜索,我发现这表明,要这样做,您只需设置control.Anchor=AnchorStyles.None,控件将在其单元格中居中 这确实很有效,但我现在发现了一个奇怪的行为。我现在开始构建表单,所以它完全是赤裸裸的,上面有一个简单的图形,下面有一个文本框。完成后,图形将占据面板的整个第一行,其余所有控件将分布在它下面 因此,

我开始使用C#,并尝试创建一个包含许多不同控件的表单。为了保持简单,我使用了
TableLayoutPanel
来处理格式设置。但是,我希望所有控件都集中在各自的单元中。经过一些搜索,我发现这表明,要这样做,您只需设置
control.Anchor=AnchorStyles.None
,控件将在其单元格中居中

这确实很有效,但我现在发现了一个奇怪的行为。我现在开始构建表单,所以它完全是赤裸裸的,上面有一个简单的图形,下面有一个文本框。完成后,图形将占据面板的整个第一行,其余所有控件将分布在它下面

因此,我只需设置
panel.SetColumnSpan(图2)
(对于两列)。这和预期的一样,只是现在下面的文本框不再集中

以下是我目前掌握的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Form form = new Form();
            form.AutoSize = true;
            form.FormBorderStyle = FormBorderStyle.FixedDialog;

            Chart chart = new Chart();
            chart.Anchor = AnchorStyles.None;
            //...

            TextBox text = new TextBox();
            text.Text = "A";
            text.Anchor = AnchorStyles.None;

            TableLayoutPanel box = new TableLayoutPanel();
            box.AutoSize = true;
            box.RowCount = 2;
            box.ColumnCount = 2;
            box.Controls.Add(chart,0,0);
            box.SetColumnSpan(chart, 2);
            box.Controls.Add(text,0,1);

            form.Controls.Add(box);
            form.ShowDialog();
        }
    }
}
以下是带有
框的结果。SetColumnSpan
已注释掉:

当它处于活动状态时:


更新: 将文本框设置为ColumnSpan(2)同样有效,但它有点过头了。例如,如果我想在第二行有两个文本框,我希望它们分别位于各自单元格的中心

在本例中,我现在添加第二个文本框:

        TextBox text2 = new TextBox();
        text2.Text = "B";
        text2.Anchor = AnchorStyles.None;
并将其添加到面板:

    TableLayoutPanel box = new TableLayoutPanel();
    box.AutoSize = true;
    box.RowCount = 2;
    box.ColumnCount = 2;
    box.Controls.Add(chart,0,0);
    box.SetColumnSpan(chart, 2);
    box.Controls.Add(text,0,1);
    box.Controls.Add(text2, 1, 1);
然而,结果再次令人不满意:每个文本框都明显地“左对齐”。

更新:您的代码缺少colum样式。只需设置为此,即可完成以下操作:

this.box.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.box.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));

要使文本框在表单中心对齐(TableLayoutPanel),请将列跨度也设置为2。如果不是,则根据文本框的大小,它位于第一列的中心

this.box.ColumnCount = 2;
this.box.RowCount = 2;
this.box.Controls.Add(this.chart, 0, 0);
this.box.Controls.Add(this.text, 0, 1);

this.box.SetColumnSpan(this.chart, 2);

this.text.Anchor = System.Windows.Forms.AnchorStyles.None;
给予

并设置如下:

this.box.SetColumnSpan(this.text, 2);

和不带文本列跨距,但带到文本框:


更新:您的代码缺少colum样式。只需设置为此,即可完成以下操作:

this.box.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.box.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));

要使文本框在表单中心对齐(TableLayoutPanel),请将列跨度也设置为2。如果不是,则根据文本框的大小,它位于第一列的中心

this.box.ColumnCount = 2;
this.box.RowCount = 2;
this.box.Controls.Add(this.chart, 0, 0);
this.box.Controls.Add(this.text, 0, 1);

this.box.SetColumnSpan(this.chart, 2);

this.text.Anchor = System.Windows.Forms.AnchorStyles.None;
给予

并设置如下:

this.box.SetColumnSpan(this.text, 2);

和不带文本列跨距,但带到文本框:


这是可行的,但有点过头了。例如,我想要的是在第二行有两个文本框,每个文本框在各自的单元格中居中。我已经更新了上面的内容,显示每个文本框都是左对齐的。正如我提到的,并没有在文本框上设置列跨度,而是将它放在第一列的中心。我有一个简单的项目展示了这种行为。我注意到了你缺少的列样式。只需按照上面发布的那样使用它们。接得好。那会管用的,是的,但有点过头了。例如,我想要的是在第二行有两个文本框,每个文本框在各自的单元格中居中。我已经更新了上面的内容,显示每个文本框都是左对齐的。正如我提到的,并没有在文本框上设置列跨度,而是将它放在第一列的中心。我有一个简单的项目展示了这种行为。我注意到了你缺少的列样式。只需按照上面发布的那样使用它们。好主意。
我开始使用C
-请看
我开始使用C
-请看