【问题标题】:How to place a new panel underneath existing controls?如何在现有控件下方放置新面板?
【发布时间】:2014-07-20 06:58:59
【问题描述】:

这种情况经常发生:我布置了很多控件,并且我决定出于任何原因将它们放入面板中 - 也许是为了更容易一次禁用它们而不影响其他控件, 或隔离一些单选按钮等。

我发现在我的控件“下方”添加System.Windows.Forms.Panel 是一项繁琐的操作。这通常涉及调整我的父控件或表单的大小,以便我可以将面板添加到与即将占据面板的控件集合相邻的临时空间中,然后将控件拖到面板上,然后将父控件/表单大小设置回以前是什么。

我经常在各种控件上以各种方式设置锚点,因此如果控件的精心调整布局变得一团糟,就不会简单地调整父级的大小。

对于本应如此简单的操作,这显然是一个繁琐的过程。是否有 VS 技巧来执行此操作(除了手动编辑设计器生成的文件,这意味着我必须按名称手动选择要重新父级的控件)?

【问题讨论】:

  • 不是我发现的。冒着看起来过于挑剔的风险,它实际上归结为在构建之前对形式进行深思熟虑的规划。
  • @DonBoitnott -- 对于理论上的软件开发来说,这是一个不错的想法,但在实践中,这需要 100% 无可挑剔的前端。此外,这可能是无法控制的(例如,客户改变主意)。
  • 也许吧,但您的评论“这种情况经常发生”表明要么缺乏计划,要么运气不佳。
  • @DonBoitnott Touché。但是,那么,我从来没有声称拥有无可挑剔的前站 :)
  • 我承认我也遇到过几次。这就是为什么我现在很少布局不以Panel 或TableLayoutPanel 开头的表单。重于后者。

标签: .net visual-studio winforms visual-studio-2010 visual-studio-2019


【解决方案1】:

没有直接的方法,但有可用的解决方法(Visual Studio 2010 - 2019):

假设您有一个名为Form1.cs 的表单,并且上面已经有控件,例如linkLabel、checkBoxes、radioButtons 和progressBar。

诀窍是编辑*.Designer.cs 文件,而不是移动控件。执行以下操作:

  1. 将新面板 (panel1) 放置在 Form1 上,就像您通常做的那样(使用工具箱),并给它一个大小以覆盖其他控件。
  2. 关闭表单(和所有相关文件),然后在解决方案资源管理器中激活“显示所有文件”。现在Form1.Designer.cs 变得可见。打开它。
  3. 找到以下代码,它包含注册到表单的控件:

        // 
        // 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 集合(this.panel1.Controls)。在源代码中将其从一处移动到另一处,然后使用  Alt+Shift (Visual Studio 编辑器中的 block edit mode - 按住键之前你开始选择,并释放它们之后你已经选择了整个块)以将this.Controls替换为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();

最后,关闭Form1.Designer.cs 并通过双击Form1.cs 重新打开表单。现在您应该看到面板内的控件。位置和以前一样。


注意:此描述是针对 Visual Studio 进行的,如果您使用的是 Visual Studio Code,您可以使用 multi cursor selection 实现相同的效果:键盘快捷键分别是:Strg+Alt+向上箭头或Strg+Alt+向下箭头。或者,您可以选择,然后按 Ctrl+Shift+L 将多个光标添加到当前选择的所有位置。使用多个光标,您键入的任何内容都将在所有光标位置插入/覆盖。

【讨论】:

  • 谢谢。去年我没有完成任何工作,因为我一直在等待有人回答这个问题:) 我的老板真的生我的​​气。但说真的,谢谢。
  • 不客气。你知道,你最近帮助了我,所以我想让我们挑选一个你未回答的问题并回答它们。这就是驱动 Stackoverflow 并使其如此强大的原因。 :-)
  • 嘿伙计,您知道 Dave Hampel 在他的回答中刚刚描述的行为吗?这让我大吃一惊!
  • @rory.ap - 是的,在我回答 3 年后,Dave 想出了这个妙招!顺便说一句,我赞成他的回答。不过,我给出的答案让您对设计师如何组织您放置在表单上的控件有所了解……有时,我还需要在那里修补一些东西。
  • 哦,哎呀,我不知何故混淆了戴夫的答案和几天前 Gen1-1 的新答案,这就是我上次评论的意思。戴夫的很好,但您绝对应该检查另一个;这是迄今为止最简单的方法。
【解决方案2】:

这也偶尔发生在我身上,我改变主意并希望现有控件现在位于面板(或其他一些容器...GroupBox、FlowLayout 等)中。

大多数时候,Microsoft 提供的答案对我很有效,并记录在此:Reassign Existing Controls to a Different Parent

不是将容器控件拖到窗体上,而是围绕现有控件“绘制”容器控件的轮廓,然后容器将抓取现有控件并将它们设为子控件。

步骤:

  1. 在工具箱中,单击以选择要使用的容器控件,然后松开鼠标按钮。不要将控件拖到表单中。
  2. 将鼠标移动到现有控件所在的表单区域,并注意指针变为十字准线,并带有您选择的任何新容器控件的图标。
  3. 按住鼠标按钮,然后在现有控件“周围”拖动并绘制新控件的轮廓。注意完全包围所有控件;如果新容器控件的边框太靠近控件,则现有控件可能不会被包含在内。
  4. 松开鼠标按钮。

就是这样。现有控件现在应该是容器的子级。 我知道它适用于 VS 2015 及更高版本,但我猜它至少适用于之前的几个版本。

【讨论】:

  • 哇,这么多年了,我从来没有知道这一点!这样工作多久了?
  • @rory.ap 我在 VS 2015 及更高版本中使用过它,但我猜它的存在时间比这更长。
【解决方案3】:

马特有一个很好的答案,但这可能会更容易一些。

在您的表单上放置一个面板并将Dock 设置为完整。您将看不到任何控件。然后打开表单的Document Outline。将每个控件拖放到Panel1。每个控件都将落在您希望它们所在的位置。现在,如果您愿意,您可以通过简单地设置 Panel1.Disabled = true 来禁用面板中的所有控件。

如果您不希望将某些控件作为面板的一部分。选择Document Outline 中的控件并选择Bring to Front。此控件将可见,并且不受设置面板 Enable 属性的影响。

【讨论】:

  • 戴夫,我给出的答案的优点是,如果您有很多控件可以移动(例如,超过 10 个),它的工作速度很快。如果您只有几个,那么您的答案就很好(并且还保留了屏幕位置)。谢谢!我赞成你的回答。一个提示:“放在前面”不在文档大纲中,而是直接在表单编辑器(上下文菜单)中。
  • 直到文档大纲是一个东西。谢谢。
  • 这个解决方案比弄乱设计器文件要容易得多!
  • 在哪里可以找到文档大纲?
  • 啊哈,我找到了:查看 => 其他 Windows => 文档大纲 (Ctrl+Alt+T)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2013-07-26
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多