我使用Windows窗体在C#中编写应用程序。它是一个带有菜单,选项卡式窗格,网格和状态栏的表单。即使在调整窗口大小时,我也希望控件能够正确显示。如果我在不使用任何布局面板的情况下将控件添加到表单,则菜单栏会显示在选项卡的顶部(参见图1)。另一方面,如果我使用FlowLayoutPanel从上到下添加组件,则控件不会填充可用空间(参见图2)。
编辑:我无法使用TableLayoutPanel解决它。垂直空间也没有填满。见图3.
可能是什么问题?在Windows窗体中使用Layouts的常用方法是什么?提前谢谢。
代码如下:
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);
}
}
}
}
答案 0 :(得分:2)
您必须使用TableLayoutPanel
代替FlowLayoutPanel
。
FlowLayoutPanel
用于形成一堆控件,一个接一个地解决包装问题。
TableLayoutPanel
是一个包含所有类型单元格操作的表格:垂直/水平扩展到更多单元格,大小调整,比例等。
对于您的任务,您需要TableLayoutPanel
:
DataGridView
(在标签窗格内我猜?)(100%)和状态栏(自动调整大小)。
然后将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
。
对于水平流向:
提供最高儿童控制的尺寸。