Windows窗体中的布局难度

时间:2014-05-19 07:56:31

标签: c# winforms user-interface

我使用Windows窗体在C#中编写应用程序。它是一个带有菜单,选项卡式窗格,网格和状态栏的表单。即使在调整窗口大小时,我也希望控件能够正确显示。如果我在不使用任何布局面板的情况下将控件添加到表单,则菜单栏会显示在选项卡的顶部(参见图1)。另一方面,如果我使用FlowLayoutPanel从上到下添加组件,则控件不会填充可用空间(参见图2)。

编辑:我无法使用TableLayoutPanel解决它。垂直空间也没有填满。见图3.

可能是什么问题?在Windows窗体中使用Layouts的常用方法是什么?提前谢谢。

Screenshot without layout panel

Screenshot with FlowLayoutPanel

Screenshot with TableLayoutPanel

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AGAPconsole;

namespace AGAP
{
public partial class MainForm : Form
{

    private String user;
    private ClassDatabase db;

    private TableLayoutPanel mainPanel;
    private TabControl mainTabControl;
    private TabPage mainTabPage;

    // Grid de actuaciones
    private DataGridView actuacionesGrid;
    private ContextMenuStrip actuacionesContextMenuStrip;
    private ToolStripMenuItem verTramitesMenuItem;
    private ToolStripMenuItem verEncargosMenuItem;
    private ToolStripMenuItem verTrabajosMenuItem;
    private ToolStripMenuItem verDatosObraMenuItem;

    // Barra de estado
    private StatusStrip mainStatusStrip;
    private ToolStripStatusLabel mainStatusLabel;

    // Menu
    private MenuStrip mainMenuStrip;
    private ToolStripMenuItem archivoMenuItem;
    private ToolStripMenuItem salirMenuItem;
    private ToolStripMenuItem abrirMenuItem;

    // Importacion
    private OpenFileDialog openFileDialog;

    // Users
    public static String USER_CONSULTA_CORUNA = "Delegación C (R)";
    public static String USER_EDICION_CORUNA = "Delegación C (RW)";
    public static String USER_CONSULTA_OURENSE = "Delegación OU-LU (R)";
    public static String USER_EDICION_OURENSE = "Delegación OU-LU (RW)";
    public static String USER_CONSULTA_PONTEVEDRA = "Delegación PO (R)";
    public static String USER_EDICION_PONTEVEDRA = "Delegación PO (RW)";
    public static String USER_IMPORTACION = "Importación";
    public static String USER_ZONA = "Zona";

    public static String[] USERS = { USER_ZONA, USER_CONSULTA_CORUNA, 
                                       USER_EDICION_CORUNA, USER_CONSULTA_OURENSE, 
                                       USER_EDICION_OURENSE, USER_CONSULTA_PONTEVEDRA, 
                                       USER_EDICION_PONTEVEDRA, USER_IMPORTACION };

    public MainForm(String user)
    {
        this.user = user;
        db = new ClassDatabase();
        //InitializeComponent();
        //this.AutoScaleDimensions = new SizeF(6F, 13F);
        this.AutoScaleMode = AutoScaleMode.Font;
        this.ClientSize = new Size(984, 762);
        this.Name = "MainForm";
        //this.StartPosition = FormStartPosition.CenterScreen;
        this.Text = "AGAP";
        this.WindowState = FormWindowState.Maximized;
        this.BackColor = SystemColors.Window;

        this.Controls.Add(CreateMainPanel());

        // Menu
        mainPanel.Controls.Add(CreateMainMenuStrip());

        // Contenido dependiendo del usuario

        // El menu tendra Archivo -> Salir a no ser que sea el usuario de importacion,
        // que tendra mas cosas.
        if (!user.Equals(USER_IMPORTACION))
        {
            //CreateArchivoSalir();
            CreateSalir();
        }

        if (user.Equals(USER_ZONA))
        {
            this.Text = "AGAP Visualización de datos";
            InitVisualizacion();
        }

        if (user.Equals(USER_IMPORTACION))
        {
            this.Text = "AGAP Importación de datos";
            InitImportacion();
        }

        // Barra de estado
        mainPanel.Controls.Add(CreateMainStatusStrip());
        this.mainStatusLabel.Text = "Autenticado como " + user;
    }

    private void InitImportacion()
    {
        CreateOpenFileDialog();
        // this.Controls.Add(CreateMainPanel());
        // mainPanel.Controls.Add(CreateMainMenuStrip());
        mainMenuStrip.Items.Add(CreateArchivoMenuItem());
        archivoMenuItem.DropDownItems.Add(CreateAbrirMenuItem());
        archivoMenuItem.DropDownItems.Add("-");
        archivoMenuItem.DropDownItems.Add(CreateSalirMenuItem());
    }

    private void InitVisualizacion()
    {
        // this.Controls.Add(CreateMainPanel());
        mainPanel.Controls.Add(CreateMainTabControl());
        mainTabPage.Controls.Add(CreateActuacionesGrid());
        mainTabPage.Text = "Actuaciones";
        actuacionesGrid.Name = "actuacionesGrid";
    }

    private OpenFileDialog CreateOpenFileDialog()
    {
        if (openFileDialog == null)
        {
            openFileDialog = new OpenFileDialog();
            openFileDialog.AutoUpgradeEnabled = true;
            openFileDialog.Filter = "Archivos CSV, Excel (*.csv, *.xls, *.xlsx)|*.csv;*.xls;*.xlsx|Todos los archivos (*.*)|*.*";
            openFileDialog.ValidateNames = true;
        }
        return openFileDialog;
    }

    private ToolStripMenuItem CreateAbrirMenuItem()
    {
        if (abrirMenuItem == null)
        {
            abrirMenuItem = new ToolStripMenuItem();
            abrirMenuItem.Name = "abrirMenuItem";
            abrirMenuItem.Text = "&Abrir...";
            abrirMenuItem.Click += new EventHandler(abrirMenuItem_Click);
            abrirMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.O)));
        }
        return abrirMenuItem;
    }

    private void abrirMenuItem_Click(object sender, EventArgs e)
    {
        DialogResult result = openFileDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            bool ret = false;
            string file = openFileDialog.FileName;
            if (file.EndsWith(".csv"))
            {
                ret = CSVparser.parseCSV(file);
            }
            else
            {
                // Parse Excel file
            }
            string messageBoxText;
            MessageBoxIcon icon;
            if (ret)
            {
                messageBoxText = "Importación finalizada";
                icon = MessageBoxIcon.Information;
            }
            else
            {
                messageBoxText = "La importación ha fracasado. Se ha producido un error.";
                icon = MessageBoxIcon.Warning;
            }
            string caption = "AGAP Importación de datos";
            MessageBoxButtons buttons = MessageBoxButtons.OK;
            MessageBox.Show(messageBoxText, caption, buttons, icon);
        }
    }

    private void CreateSalir()
    {
        mainMenuStrip.Items.Add(CreateSalirMenuItem());
    }

    private void CreateArchivoSalir()
    {
        mainMenuStrip.Items.Add(CreateArchivoMenuItem());
        archivoMenuItem.DropDownItems.Add(CreateSalirMenuItem());
    }

    #region Creacion de controles
    private MenuStrip CreateMainMenuStrip()
    {
        if (mainMenuStrip == null)
        {
            mainMenuStrip = new MenuStrip();
            mainMenuStrip.Name = "mainMenuStrip";
            mainMenuStrip.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
        }
        return mainMenuStrip;
    }

    private ToolStripMenuItem CreateArchivoMenuItem()
    {
        if (archivoMenuItem == null)
        {
            archivoMenuItem = new ToolStripMenuItem();
            archivoMenuItem.Name = "archivoToolStripMenuItem";
            archivoMenuItem.Text = "&Archivo";

        }
        return archivoMenuItem;
    }

    private ToolStripMenuItem CreateSalirMenuItem()
    {
        if (salirMenuItem == null)
        {
            salirMenuItem = new ToolStripMenuItem();
            salirMenuItem.Name = "salirToolStripMenuItem";
            salirMenuItem.Text = "&Salir...";
            salirMenuItem.Click += new EventHandler(salirMenuItem_Click);
            salirMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.Q)));
        }
        return salirMenuItem;
    }

    private StatusStrip CreateMainStatusStrip()
    {
        if (mainStatusStrip == null)
        {
            mainStatusStrip = new StatusStrip();
            mainStatusStrip.Name = "mainStatusStrip";
            mainStatusStrip.BackColor = SystemColors.Window;
            mainStatusStrip.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
            mainStatusStrip.Items.Add(CreateMainStatusLabel());
        }
        return mainStatusStrip;
    }

    private ToolStripStatusLabel CreateMainStatusLabel()
    {
        if (mainStatusLabel == null)
        {
            mainStatusLabel = new ToolStripStatusLabel();
            mainStatusLabel.Name = "mainStatusLabel";
            mainStatusLabel.BackColor = SystemColors.Window;
        }
        return mainStatusLabel;
    }
    private TableLayoutPanel CreateMainPanel()
    {
        if (mainPanel == null)
        {
            mainPanel = new TableLayoutPanel();
            mainPanel.Name = "mainPanel";
            mainPanel.Dock = DockStyle.Fill;
            //mainPanel.FlowDirection = FlowDirection.TopDown;
            mainPanel.Size = new Size(1280, 1024);
            mainPanel.ColumnCount = 1;
            mainPanel.RowCount = 3;
        }
        return mainPanel;
    }

    private TabControl CreateMainTabControl()
    {
        if (mainTabControl == null)
        {
            mainTabControl = new TabControl();
            mainTabControl.Controls.Add(CreateMainTabPage());
            //mainTabControl.Location = new Point(0, 0);
            mainTabControl.Name = "mainTabControl";
            mainTabControl.SelectedIndex = 0;
            //this.mainTabControl.Size = new System.Drawing.Size(745, 559);
            //mainTabControl.TabIndex = 0;
            //mainTabControl.Size = new Size(1280, 1024);
            mainTabControl.Dock = DockStyle.Fill;
            //mainTabControl.Dock = DockStyle.Bottom | DockStyle.Top | DockStyle.Left;
            //mainTabControl.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right ;
            mainTabControl.MouseClick += new MouseEventHandler(mainTabControl_MouseClick);
        }
        return mainTabControl;
    }

    private void mainTabControl_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ContextMenuStrip cms = CreateMainTabControlContextMenuStrip();
            cms.Show(mainTabControl, e.Location);
        }
        if (e.Button == MouseButtons.Middle)
        {
            if (mainTabControl.SelectedIndex != 0)
            {
                mainTabControl.TabPages.Remove(mainTabControl.SelectedTab);
            }
        }
    }

    private ContextMenuStrip CreateMainTabControlContextMenuStrip()
    {
        ContextMenuStrip cms = new ContextMenuStrip();
        cms.Items.AddRange(new ToolStripMenuItem[] { CreateCloseTabMenuItem() });
        return cms;
    }

    private ToolStripMenuItem CreateCloseTabMenuItem()
    {
        var closeTabMenuItem = new ToolStripMenuItem();
        closeTabMenuItem.Text = "&Cerrar pestaña";
        closeTabMenuItem.Click += new EventHandler(closeTabMenuItem_Click);
        //closeTabMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.F4)));
        return closeTabMenuItem;
    }

    private void closeTabMenuItem_Click(object sender, EventArgs e)
    {
        if (mainTabControl.SelectedIndex != 0)
        {
            mainTabControl.TabPages.Remove(mainTabControl.SelectedTab);
        }
    }

    private TabPage CreateTabPage()
    {
        var tabPage = new TabPage();
        //tabPage.Location = new Point(4, 22);
        //tabPage.Padding = new Padding(3);
        //tabPage.UseVisualStyleBackColor = true;
        return tabPage;
    }

    private TabPage CreateMainTabPage()
    {
        if (mainTabPage == null)
        {
            mainTabPage = CreateTabPage();
            mainTabPage.Name = "mainTabPage";
            mainTabPage.Text = "Actuaciones";
            //mainTabPage.TabIndex = 0;
        }
        return mainTabPage;
    }

    private DataGridView CreateGrid()
    {
        DataGridView grid = new DataGridView();
        // Propiedades fijas
        grid.AllowUserToOrderColumns = true;
        grid.RowHeadersVisible = false;
        grid.StandardTab = false;
        grid.ReadOnly = true;
        grid.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        grid.MultiSelect = false;
        grid.ScrollBars = ScrollBars.Both;
        grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
        grid.BackgroundColor = SystemColors.Window;

        // Propiedades dudosas
        //grid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        grid.Dock = DockStyle.Fill;
        //grid.Location = new Point(0, 0);
        //grid.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
        grid.TabIndex = 0;
        //grid.Size = new Size(1280, 1024);
        //grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        //grid.AutoSize = true;

        //grid.PerformLayout();

        return grid;
    }

    private DataGridView CreateActuacionesGrid()
    {
        if (actuacionesGrid == null)
        {
            actuacionesGrid = CreateGrid();
            actuacionesGrid.MouseDown += new MouseEventHandler(actuacionesGrid_MouseDown);
            actuacionesGrid.DataSource = ComunicacionBD.SelectActuaciones(db).Tables[0].DefaultView;
            actuacionesGrid.ContextMenuStrip = CreateActuacionesContextMenuStrip();
        }
        return actuacionesGrid;
    }

    private ContextMenuStrip CreateActuacionesContextMenuStrip()
    {
        if (actuacionesContextMenuStrip == null)
        {
            actuacionesContextMenuStrip = new ContextMenuStrip();
            actuacionesContextMenuStrip.Name = "actuacionesContextMenuStrip";
            actuacionesContextMenuStrip.Items.AddRange(new ToolStripMenuItem[] { CreateVerTramitesMenuItem(),
                CreateVerEncargosMenuItem(), CreateVerTrabajosMenuItem(), CreateVerDatosObraMenuItem()});
        }
        return actuacionesContextMenuStrip;
    }

    private ToolStripMenuItem CreateVerDatosObraMenuItem()
    {
        if (verDatosObraMenuItem == null)
        {
            verDatosObraMenuItem = new ToolStripMenuItem();
            verDatosObraMenuItem.Name = "verDatosObraMenuItem";
            verDatosObraMenuItem.Text = "Ver &datos de obra";
            verDatosObraMenuItem.Click += new EventHandler(verDatosObraMenuItem_Click);
            verDatosObraMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.D)));
        }
        return verDatosObraMenuItem;
    }

    private ToolStripMenuItem CreateVerTramitesMenuItem()
    {
        if (verTramitesMenuItem == null)
        {
            verTramitesMenuItem = new ToolStripMenuItem();
            verTramitesMenuItem.Name = "verTramitesMenuItem";
            verTramitesMenuItem.Text = "Ver &trámites";
            verTramitesMenuItem.Click += new EventHandler(verTramitesMenuItem_Click);
            verTramitesMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.T)));
        }
        return verTramitesMenuItem;
    }

    private ToolStripMenuItem CreateVerEncargosMenuItem()
    {
        if (verEncargosMenuItem == null)
        {
            verEncargosMenuItem = new ToolStripMenuItem();
            verEncargosMenuItem.Name = "verEncargosMenuItem";
            verEncargosMenuItem.Text = "Ver &encargos";
            verEncargosMenuItem.Click += new EventHandler(verEncargosMenuItem_Click);
            verEncargosMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.E)));
        }
        return verEncargosMenuItem;
    }

    private ToolStripMenuItem CreateVerTrabajosMenuItem()
    {
        if (verTrabajosMenuItem == null)
        {
            verTrabajosMenuItem = new ToolStripMenuItem();
            verTrabajosMenuItem.Name = "verTrabajosMenuItem";
            verTrabajosMenuItem.Text = "Ver t&rabajos";
            verTrabajosMenuItem.Click += new EventHandler(verTrabajosMenuItem_Click);
            verTrabajosMenuItem.ShortcutKeys = ((Keys)((Keys.Control | Keys.W)));
        }
        return verTrabajosMenuItem;
    }

    #endregion

    #region Event Handlers
    private void actuacionesGrid_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            var hti = actuacionesGrid.HitTest(e.X, e.Y);
            actuacionesGrid.ClearSelection();
            actuacionesGrid.Rows[hti.RowIndex].Selected = true;
        }
    }

    private void verTramitesMenuItem_Click(object sender, EventArgs e)
    {
        // Coger la actuacion seleccionada.
        //Actuacion act = (Actuacion) actuacionesGrid.CurrentRow.DataBoundItem;
        string obraid = actuacionesGrid.CurrentRow.Cells["ObraId"].Value.ToString();

        // Crear la pestaña.
        var tabPage = CreateTabPage();
        tabPage.Name = "tramitesTabPage" + obraid;
        tabPage.Text = "Trámites actuación " + obraid;
        mainTabControl.TabPages.Add(tabPage);
        mainTabControl.SelectedTab = tabPage;

        // Crear el FlowLayoutPanel
        //var panel = new FlowLayoutPanel();
        //tabPage.Controls.Add(panel);

        // Crear el panel con las labels de la actuacion
        //panel.Controls.Add(CreateActuacionPanel(act));

        // Crear la tabla
        var grid = CreateTramitesGrid();
        grid.DataSource = ComunicacionBD.SelectTramites(db, obraid).Tables[0].DefaultView;
        tabPage.Controls.Add(grid);
    }

    private void verDatosObraMenuItem_Click(object sender, EventArgs e)
    {
        // Coger la actuacion seleccionada.
        //Actuacion act = (Actuacion) actuacionesGrid.CurrentRow.DataBoundItem;
        string obraid = actuacionesGrid.CurrentRow.Cells["ObraId"].Value.ToString();

        // Crear la pestaña.
        var tabPage = CreateTabPage();
        tabPage.Name = "datosObraTabPage" + obraid;
        tabPage.Text = "Datos de obra " + obraid;
        mainTabControl.TabPages.Add(tabPage);
        mainTabControl.SelectedTab = tabPage;

        // Crear el FlowLayoutPanel
        //var panel = new FlowLayoutPanel();
        //tabPage.Controls.Add(panel);

        // Crear el panel con las labels de la actuacion
        //panel.Controls.Add(CreateActuacionPanel(act));

        // Crear la tabla
        var grid = CreateTramitesGrid();
        grid.DataSource = ComunicacionBD.SelectDatosObra(db, obraid).Tables[0].DefaultView;
        tabPage.Controls.Add(grid);
    }


    private Panel CreateActuacionPanel(Actuacion act)
    {
        var actuacionPanel = new FlowLayoutPanel();
        actuacionPanel.FlowDirection = FlowDirection.LeftToRight;

        var actuacionLabel = new Label();
        actuacionLabel.Text = "Actuación: " + act.ActuacionId;

        var descLabel = new Label();
        descLabel.Text = "Descripción: " + act.Descripcion;

        actuacionPanel.Controls.Add(actuacionLabel);
        actuacionPanel.Controls.Add(descLabel);
        return actuacionPanel;
    }

    private DataGridView CreateTramitesGrid()
    {
        var grid = CreateGrid();
        return grid;
    }

    private DataGridView CreateTrabajosGrid()
    {
        var grid = CreateGrid();
        return grid;
    }

    private void verEncargosMenuItem_Click(object sender, EventArgs e)
    {
        // Coger la actuacion seleccionada.
        //Actuacion act = (Actuacion) actuacionesGrid.CurrentRow.DataBoundItem;
        string obraid = actuacionesGrid.CurrentRow.Cells["ObraId"].Value.ToString();

        // Crear la pestaña.
        var tabPage = CreateTabPage();
        tabPage.Name = "encargosTabPage" + obraid;
        tabPage.Text = "Encargos actuación " + obraid;
        mainTabControl.TabPages.Add(tabPage);
        mainTabControl.SelectedTab = tabPage;

        // Crear el FlowLayoutPanel
        //var panel = new FlowLayoutPanel();
        //tabPage.Controls.Add(panel);

        // Crear el panel con las labels de la actuacion
        //panel.Controls.Add(CreateActuacionPanel(act));

        // Crear la tabla
        var grid = CreateTrabajosGrid();
        grid.DataSource = ComunicacionBD.SelectEncargos(db, obraid).Tables[0].DefaultView;
        tabPage.Controls.Add(grid);
    }

    private void verTrabajosMenuItem_Click(object sender, EventArgs e)
    {
        // Coger la actuacion seleccionada.
        //Actuacion act = (Actuacion) actuacionesGrid.CurrentRow.DataBoundItem;
        string obraid = actuacionesGrid.CurrentRow.Cells["ObraId"].Value.ToString();

        // Crear la pestaña.
        var tabPage = CreateTabPage();
        tabPage.Name = "trabajosTabPage" + obraid;
        tabPage.Text = "Trabajos actuación " + obraid;
        mainTabControl.TabPages.Add(tabPage);
        mainTabControl.SelectedTab = tabPage;

        // Crear el FlowLayoutPanel
        //var panel = new FlowLayoutPanel();
        //tabPage.Controls.Add(panel);

        // Crear el panel con las labels de la actuacion
        //panel.Controls.Add(CreateActuacionPanel(act));

        // Crear la tabla
        var grid = CreateTrabajosGrid();
        grid.DataSource = ComunicacionBD.SelectTrabajos(db, obraid).Tables[0].DefaultView;
        tabPage.Controls.Add(grid);
    }

    private void salirMenuItem_Click(object sender, EventArgs e)
    {
        Close();
    }
    #endregion

    // Por culpa de tener un Form de Login antes, hay que hacer este metodo asi.
    // Seguramente hay formas mejores de hacerlo, pero esto funciona.
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);

        if (e.CloseReason == CloseReason.WindowsShutDown)
        {
            return;
        }

        switch (MessageBox.Show(this, "¿Salir ahora?", "Salir", MessageBoxButtons.YesNo))
        {
            case DialogResult.Yes:
                break;
            default:
                e.Cancel = true;
                break;
        }
        if (!e.Cancel)
        {
            Environment.Exit(0);
        }
    }
}

}

2 个答案:

答案 0 :(得分:2)

您必须使用TableLayoutPanel代替FlowLayoutPanel

FlowLayoutPanel用于形成一堆控件,一个接一个地解决包装问题。 TableLayoutPanel是一个包含所有类型单元格操作的表格:垂直/水平扩展到更多单元格,大小调整,比例等。

对于您的任务,您需要TableLayoutPanel

  • 只有一栏;
  • 3行:用于菜单(自动调整大小),用于DataGridView(在标签窗格内我猜?)(100%)和状态栏(自动调整大小)。

enter image description here

然后将TableLayoutPanel停靠设置为Fill,这应该是非常重要的。

提示:确保在将行设置为AutoSize之前将控件放在单元格内。

这里指的是TableLayoutPanel可以分配指定百分比(在我们的情况下为100%或任何其他值将执行的内容,因为只有1行请求大小的百分比)并且将增加/减少单元格大小如果面板的大小改变了。然后,您可以使用单元格以您喜欢的方式在单元格内停靠/锚定控件。为此,请参阅@Hassan Nisar的答案,虽然它已经被投票赞成,但它目前的形式不会解决你的问题,也许是有用的; - )。

答案 1 :(得分:1)

您必须设置FlowLayoutPanel的Anchor属性。

通过使用此属性,您可以设置控件绑定到的容器的边缘,并确定如何使用其父控件调整控件的大小。

用于锚定和停靠子控件

以下是How to: Anchor and Dock Child Controls in a FlowLayoutPanel Control上的MSDN示例。

<强>更新

这是MSDN关于FlowLayoutPanel

的重要说明
  

锚定和对接的一般规则   FlowLayoutPanel控件:用于垂直流向,   FlowLayoutPanel控件计算隐含列的宽度   列中最宽的子控件。此中的所有其他控件   具有Anchor或Dock属性的列对齐或拉伸以适合   这个隐含的专栏。该行为以类似的方式工作   水平流向。 FlowLayoutPanel控件计算   来自行中最高子控件的隐含行的高度,   并且此行中的所有停靠或锚定的子控件都对齐或   大小适合隐含的行。

垂直流向
供应最大的儿童控制尺寸。 (例如,在您的情况下,控件可以是datagridview1

对于水平流向
提供最高儿童控制的尺寸。