在现有控件下放置一个新面板

时间:2014-05-30 13:35:18

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

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

我发现在我的控件下面添加System.Windows.Forms.Panel“这是一项繁琐的操作。这通常涉及调整我的父控件或窗体的大小,以便我可以将面板添加到一个临时空间中,该控件将很快占据面板,然后将控件拖到面板上,然后将父控件/窗体大小设置回以前是什么

通常我会在各种控件上以各种方式设置锚点,这样,如果没有经过仔细调整的控件布局,那么简单地调整父级的大小就不会发生。

对于应该如此简单的操作来说,这显然是一个繁琐的过程。这样做是否有VS技巧(除了手动编辑设计器生成的文件外,这意味着我必须按名称手工挑选控件,我想重新父母)?

3 个答案:

答案 0 :(得分:3)

没有直接的方法,但提供了一种解决方法(Visual Studio 2010 - 2017):

假设您有一个名为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();
    
  4. 然后,查找创建面板的代码:

            // 
            // 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}}:

    BlockEditAnimation 并且添加到表单的唯一剩余控件是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

您无需将容器控件拖到窗体上,而是在现有控件周围“绘制”容器控件的轮廓,然后容器将抓住现有控件并使它们成为子控件。

步骤:

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

就是这样。现在,现有控件应该是容器的子级。 我知道它可以在VS 2015及更高版本中使用,但是我猜想它至少可以在多个版本中使用。