【问题标题】:Difficulty with Layouts in Windows FormsWindows 窗体中的布局困难
【发布时间】:2014-07-07 02:27:10
【问题描述】:

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

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

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

代码如下:

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);
        }
    }
}

}

【问题讨论】:

  • TableLayoutPanel 可以。
  • 我已经尝试过使用 TableLayoutPanel 但我仍然无法解决它。使用此信息编辑问题。
  • 您忘记将SizeType 设置为100% 用于DataGridView 单元格,请参阅我的答案。

标签: c# winforms user-interface


【解决方案1】:

您必须使用TableLayoutPanel 而不是FlowLayoutPanel

FlowLayoutPanel用于组成一堆控件,一个接一个,解决换行。 TableLayoutPanel 是一个包含各种单元格操作的表格:垂直/水平扩展到更多单元格、调整大小、比例等。

对于您的任务,您需要TableLayoutPanel:

  • 只有一列;
  • 3 行:用于菜单(自动调整大小)、DataGridView(我猜是在选项卡式窗格内?)(100%)和状态栏(自动调整大小)。

然后将TableLayoutPanel 设置为Fill 就应该差不多了。

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

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

【讨论】:

    【解决方案2】:

    您必须设置 FlowLayoutPanel 的Anchor 属性。

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

    对于锚定和停靠子控件

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

    更新

    这是 MSDN 上关于 FlowLayoutPanel 的重要说明:

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

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

    水平流向
    最高子控件的供应尺寸。

    【讨论】:

    • 你的意思是锚定FlowLayoutPanel?这并不能解决问题,因为FlowLayoutPanel 中没有take all available size 概念。使用Dock = Fill(或在任何地方锚定)它将占用所有客户端区域,DataGridView 的大小仍然是最小的。
    • 我已经更新了我的答案。但FlowLayoutPanel 控件仍然支持其子控件中的 Anchor 和 Dock 属性。请检查来自 MSDN 的链接。
    • 我想你忘了更新 MSDN 的链接。谢谢你的教程,我去看看。
    • @Sinatr 你检查过更新的答案吗?不是OP需要的吗?
    • 检查了吗?没用,试试停靠子级不会增加它们的大小(对于水平布局 - 无法水平增加它,对于垂直 - 垂直,尽管您可以增加,例如,垂直布局中的子 width )。因此,DataGridView 不会占用 可用大小。您可以将其设置为固定大小,但您也可以将其设置为固定位置并删除FlowLayoutPanel,因为无论如何您都不使用布局
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多