这种情况发生了很多:我已经设置了很多控件,并且我决定将它们放入面板中,无论出于何种原因 - 也许是为了让它更容易一次性地禁用它们而不影响其他控件,或隔离一些单选按钮等。
我发现在我的控件下面添加System.Windows.Forms.Panel
“这是一项繁琐的操作。这通常涉及调整我的父控件或窗体的大小,以便我可以将面板添加到一个临时空间中,该控件将很快占据面板,然后将控件拖到面板上,然后将父控件/窗体大小设置回以前是什么
通常我会在各种控件上以各种方式设置锚点,这样,如果没有经过仔细调整的控件布局,那么简单地调整父级的大小就不会发生。
对于应该如此简单的操作来说,这显然是一个繁琐的过程。这样做是否有VS技巧(除了手动编辑设计器生成的文件外,这意味着我必须按名称手工挑选控件,我想重新父母)?
答案 0 :(得分:3)
没有直接的方法,但提供了一种解决方法(Visual Studio 2010 - 2017):
假设您有一个名为Form1.cs
的表单,并且已有控件,例如linkLabel,checkBoxes,radioButtons和progressBar。
诀窍是编辑*.Designer.cs
文件而不是移动控件。执行以下操作:
panel1
)放在Form1
上,就像您通常所做的那样(使用工具箱),然后给它一个大小,使其覆盖其他控件。Form1.Designer.cs
变得可见了。打开它。找到以下代码,它包含注册到表单的控件:
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.linkLabel1);
this.Controls.Add(this.panel1);
this.Controls.Add(this.checkBox1);
this.Controls.Add(this.radioButton1);
this.Controls.Add(this.btnOk);
this.Name = "Form1";
this.Text = "Form1";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
然后,查找创建面板的代码:
//
// panel1
//
this.panel1.Location = new System.Drawing.Point(12, 12);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(260, 198);
this.panel1.TabIndex = 7;
您需要做的就是将控件从表单Controls
集合(this.Controls
)移动到面板的Controls
集合({{1 }})。在源代码中将其从一个位置移动到另一个位置,然后使用 Alt + Shift (Visual Studio中的block edit mode&# 39; s编辑器 - 在开始选择之前按住键,然后在选择整个块之后将它们释放出来)将this.panel1.Controls
替换为{ {1}}:
并且添加到表单的唯一剩余控件是this.Controls
和ok按钮this.panel1.Controls
:
panel1
最后,关闭btnOk
,然后双击 //
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.panel1);
this.Controls.Add(this.btnOk);
this.Name = "Form1";
this.Text = "Form1";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
重新打开表单。现在您应该看到面板内的控件。这些职位与以前一样。
注意:此描述是针对Visual Studio进行的,如果您使用 Visual Studio代码,则可以使用{{3}实现相同功能}:键盘快捷键为: Strg + Alt + 向上箭头或 Strg + Alt + 向下箭头。或者,您可以选择,然后按 Ctrl + Shift + L 将多个游标添加到当前选择的所有出现。使用多个游标时,您键入的任何内容都将在所有光标位置插入/覆盖。
答案 1 :(得分:2)
Matt有一个非常好的答案,但这可能会更容易一些。
在表单上放置一个面板,并将Dock
设置为已满。您将无法看到任何控件。然后打开表单的Document Outline
。将每个控件拖放到Panel1
上。每个控件都将落在您想要的位置。现在,如果您愿意,只需设置Panel1.Disabled = true
。
如果您不想将控件作为面板的一部分。在Document Outline
中选择控件,然后选择Bring to Front
。通过设置面板启用属性,此控件将可见且不受影响。
答案 2 :(得分:1)
这偶尔也发生在我身上,我改变主意,希望现有控件现在位于面板(或其他容器... GroupBox,FlowLayout等)中。
大多数情况下,Microsoft提供的答案对我来说效果很好,并记录在这里:Reassign Existing Controls to a Different Parent
您无需将容器控件拖到窗体上,而是在现有控件周围“绘制”容器控件的轮廓,然后容器将抓住现有控件并使它们成为子控件。
步骤:
就是这样。现在,现有控件应该是容器的子级。 我知道它可以在VS 2015及更高版本中使用,但是我猜想它至少可以在多个版本中使用。