使用 window 均匀调整两个表单控件的大小
Make two form controls resize with window evenly
我在设计器中有一个看起来像这样的表单,两个网格视图,完全相同的属性。它工作了一点,但现在当我调整它的大小时,只有右边的网格视图水平扩展,它们都垂直扩展。同时锁定表单和控件并不能阻止我调整表单的大小,这将是最简单的解决方案。
这可能是什么原因造成的?网格视图上唯一相关的属性是每个视图上的顶部、右侧、左侧、底部的锚点。请参阅底部的代码。
以下是部分截图:
这是设计器中的表单:
这是我尝试调整大小时的表格:
如您所见,右半部分更宽,我也无法正常调整它的大小,因为我尝试对角线调整大小,它主要是垂直增长,水平调整大小做同样的事情。我一直有调整大小的问题,但两个 gridviews 起初都是同样调整大小,我没有做任何改变,他们停止了。我在这里错过了什么吗?为什么锁定表单不能阻止它调整大小?我也锁定了所有控件。
以防万一,下面是设计器中网格视图的代码,第一个是正确的:
// clientHistoryTableDataGridView
//
this.clientHistoryTableDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.clientHistoryTableDataGridView.AutoGenerateColumns = false;
this.clientHistoryTableDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.clientHistoryTableDataGridView.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.clientHistoryTableDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.clientHistoryTableDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dataGridViewTextBoxColumn4,
this.dataGridViewTextBoxColumn5,
this.dataGridViewTextBoxColumn6});
this.clientHistoryTableDataGridView.DataSource = this.clientHistoryTableBindingSource;
this.clientHistoryTableDataGridView.Location = new System.Drawing.Point(426, 52);
this.clientHistoryTableDataGridView.Name = "clientHistoryTableDataGridView";
this.clientHistoryTableDataGridView.RowHeadersVisible = false;
this.clientHistoryTableDataGridView.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.clientHistoryTableDataGridView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.clientHistoryTableDataGridView.Size = new System.Drawing.Size(430, 360);
this.clientHistoryTableDataGridView.TabIndex = 4;
this.clientHistoryTableDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.clientHistoryTableDataGridView_CellContentClick);
和左侧:
// clientTableDataGridView
//
this.clientTableDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.clientTableDataGridView.AutoGenerateColumns = false;
this.clientTableDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.clientTableDataGridView.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.clientTableDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.clientTableDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dataGridViewTextBoxColumn1,
this.dataGridViewTextBoxColumn2,
this.dataGridViewTextBoxColumn3});
this.clientTableDataGridView.DataSource = this.clientTableBindingSource;
this.clientTableDataGridView.Location = new System.Drawing.Point(1, 52);
this.clientTableDataGridView.Name = "clientTableDataGridView";
this.clientTableDataGridView.RowHeadersVisible = false;
this.clientTableDataGridView.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.clientTableDataGridView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.clientTableDataGridView.Size = new System.Drawing.Size(428, 360);
this.clientTableDataGridView.TabIndex = 3;
this.clientTableDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.clientTableDataGridView_CellContentClick);
编辑:
我通过结合使用这两个答案解决了大小调整问题。并且还禁用主窗体上的自动调整大小并将 borderstyle 设置为可调整大小。
您可以通过以下方式解决此问题:
- 将两个 gridview 的锚点设置为
Top | Bottom
。
- 覆盖表单的
OnResize
方法,如果两个网格视图都像这样手动设置宽度和位置,则在此方法中设置宽度和位置:
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
var width = ClientRectangle.Width / 2;
clientTableDataGridView.Left = 0;
clientTableDataGridView.Width = width;
clientHistoryTableDataGridView.Left = width;
clientHistoryTableDataGridView.Width = width;
}
当然,您可以在 OnResize
中完全管理网格视图的大小,而不是在第 1 步中设置锚点。为了简单起见,我在这里提到了这一步。
可能的解决方案:
添加 SplitContainer
锚 Left|Top|Right|Bottom
将 SplitterDistance
设置为 SplitContainer 宽度的一半
将 clientTableDataGridView 放在左侧面板中并设置 Dock = Fill
将 clientHistoryTableDataGridView 放在右侧面板中并设置 Dock = Fill
我在设计器中有一个看起来像这样的表单,两个网格视图,完全相同的属性。它工作了一点,但现在当我调整它的大小时,只有右边的网格视图水平扩展,它们都垂直扩展。同时锁定表单和控件并不能阻止我调整表单的大小,这将是最简单的解决方案。
这可能是什么原因造成的?网格视图上唯一相关的属性是每个视图上的顶部、右侧、左侧、底部的锚点。请参阅底部的代码。
以下是部分截图:
这是设计器中的表单:
这是我尝试调整大小时的表格:
如您所见,右半部分更宽,我也无法正常调整它的大小,因为我尝试对角线调整大小,它主要是垂直增长,水平调整大小做同样的事情。我一直有调整大小的问题,但两个 gridviews 起初都是同样调整大小,我没有做任何改变,他们停止了。我在这里错过了什么吗?为什么锁定表单不能阻止它调整大小?我也锁定了所有控件。
以防万一,下面是设计器中网格视图的代码,第一个是正确的:
// clientHistoryTableDataGridView
//
this.clientHistoryTableDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.clientHistoryTableDataGridView.AutoGenerateColumns = false;
this.clientHistoryTableDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.clientHistoryTableDataGridView.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.clientHistoryTableDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.clientHistoryTableDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dataGridViewTextBoxColumn4,
this.dataGridViewTextBoxColumn5,
this.dataGridViewTextBoxColumn6});
this.clientHistoryTableDataGridView.DataSource = this.clientHistoryTableBindingSource;
this.clientHistoryTableDataGridView.Location = new System.Drawing.Point(426, 52);
this.clientHistoryTableDataGridView.Name = "clientHistoryTableDataGridView";
this.clientHistoryTableDataGridView.RowHeadersVisible = false;
this.clientHistoryTableDataGridView.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.clientHistoryTableDataGridView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.clientHistoryTableDataGridView.Size = new System.Drawing.Size(430, 360);
this.clientHistoryTableDataGridView.TabIndex = 4;
this.clientHistoryTableDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.clientHistoryTableDataGridView_CellContentClick);
和左侧:
// clientTableDataGridView
//
this.clientTableDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.clientTableDataGridView.AutoGenerateColumns = false;
this.clientTableDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.clientTableDataGridView.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.clientTableDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.clientTableDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dataGridViewTextBoxColumn1,
this.dataGridViewTextBoxColumn2,
this.dataGridViewTextBoxColumn3});
this.clientTableDataGridView.DataSource = this.clientTableBindingSource;
this.clientTableDataGridView.Location = new System.Drawing.Point(1, 52);
this.clientTableDataGridView.Name = "clientTableDataGridView";
this.clientTableDataGridView.RowHeadersVisible = false;
this.clientTableDataGridView.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.clientTableDataGridView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.clientTableDataGridView.Size = new System.Drawing.Size(428, 360);
this.clientTableDataGridView.TabIndex = 3;
this.clientTableDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.clientTableDataGridView_CellContentClick);
编辑:
我通过结合使用这两个答案解决了大小调整问题。并且还禁用主窗体上的自动调整大小并将 borderstyle 设置为可调整大小。
您可以通过以下方式解决此问题:
- 将两个 gridview 的锚点设置为
Top | Bottom
。 - 覆盖表单的
OnResize
方法,如果两个网格视图都像这样手动设置宽度和位置,则在此方法中设置宽度和位置:
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
var width = ClientRectangle.Width / 2;
clientTableDataGridView.Left = 0;
clientTableDataGridView.Width = width;
clientHistoryTableDataGridView.Left = width;
clientHistoryTableDataGridView.Width = width;
}
当然,您可以在 OnResize
中完全管理网格视图的大小,而不是在第 1 步中设置锚点。为了简单起见,我在这里提到了这一步。
可能的解决方案:
添加 SplitContainer
锚 Left|Top|Right|Bottom
将 SplitterDistance
设置为 SplitContainer 宽度的一半
将 clientTableDataGridView 放在左侧面板中并设置 Dock = Fill
将 clientHistoryTableDataGridView 放在右侧面板中并设置 Dock = Fill