如何在另一个表单上显示GroupBox及其内容?

时间:2012-08-10 22:39:31

标签: c# winforms custom-component groupbox

我有两种形式。在第一个表单上,我有一个虚拟小键盘(我有一个GroupBox,里面有数字按钮,这是我的虚拟小键盘)。使用此虚拟小键盘,我将数字输入TextBox。在第二个表格中,我有另一个TextBox,我在其中输入数字。

我想在第二张表格中使用我的虚拟小键盘。我怎么能这样做?

如果有人向我解释我应该做什么,一步一步,我会很高兴。

5 个答案:

答案 0 :(得分:2)

1)创建一个WinForms项目,我称之为“ReusingUserControlsSample” 2)创建一个新的UserControl,将其命名为MyUserControlWithButtons或其他任何您喜欢的内容 3)出于习惯,在UserControl属性上设置“AutoSize = true”和AutoSizeMode =“GrowAndShrink”。之后你可以了解他们的所作所为 4)在UserControlDesigner上,在控件上放置一些按钮,将它们命名为“btnLetterA”,“btnLetterB”,“btnLetterC”
5)双击每个按钮,这样就会生成点击处理器 6)在UserControl的代码中,创建一个public TextBox TheOutput属性
7)在UserControl的代码中,在步骤(5)中生成的每个点击处理程序中,添加一行,将一些文本添加到TheOutput文本框的TextBox属性中。记得检查TheOutput是否为NULL。

BUILD。

8)回到Form1
9)将MyUserControlWithButtons放在表格上,将其命名为“mykeyboard”
10)在表单上放置一个TextBox,将其命名为“mytextbox”
11)转到Form1的代码
12)在te构造函数中,在“InitializeComponent”下面,将mytextbox设置为mykeyboard的TheOutput

就是这样。现在你可以构建它并运行,一切都应该没问题。请注意,'keyboard'的整个代码都在usercontrol中。表单只设置为与 文本框一起使用。在第二个表单上,您可以以相同的方式执行此操作:放置键盘,放置文本框,设置键盘以写入该文本框,它将工作相同。

守则:

MyUserControlWithButtons.cs

using System;
using System.Windows.Forms;

namespace ReusingUserControlsSample
{
    public partial class MyUserControlWithButtons : UserControl
    {
        public MyUserControlWithButtons()
        {
            InitializeComponent();
        }

        public TextBox TheOutput { get; set; }

        private void btnLetterA_Click(object sender, EventArgs e)
        {
            TheOutput.Text += "A";
        }

        private void btnLetterB_Click(object sender, EventArgs e)
        {
            TheOutput.Text += "B";
        }

        private void btnLetterC_Click(object sender, EventArgs e)
        {
            TheOutput.Text += "C";
        }
    }
}

MyUserControlWithButtons.cs

namespace ReusingUserControlsSample
{
    partial class MyUserControlWithButtons
    {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.btnLetterA = new System.Windows.Forms.Button();
            this.btnLetterB = new System.Windows.Forms.Button();
            this.btnLetterC = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // btnLetterA
            // 
            this.btnLetterA.Location = new System.Drawing.Point(3, 3);
            this.btnLetterA.Name = "btnLetterA";
            this.btnLetterA.Size = new System.Drawing.Size(66, 21);
            this.btnLetterA.TabIndex = 0;
            this.btnLetterA.Text = "The \"A\"";
            this.btnLetterA.UseVisualStyleBackColor = true;
            this.btnLetterA.Click += new System.EventHandler(this.btnLetterA_Click);
            // 
            // btnLetterB
            // 
            this.btnLetterB.Location = new System.Drawing.Point(66, 30);
            this.btnLetterB.Name = "btnLetterB";
            this.btnLetterB.Size = new System.Drawing.Size(66, 21);
            this.btnLetterB.TabIndex = 0;
            this.btnLetterB.Text = "The \"B\"";
            this.btnLetterB.UseVisualStyleBackColor = true;
            this.btnLetterB.Click += new System.EventHandler(this.btnLetterB_Click);
            // 
            // btnLetterC
            // 
            this.btnLetterC.Location = new System.Drawing.Point(3, 57);
            this.btnLetterC.Name = "btnLetterC";
            this.btnLetterC.Size = new System.Drawing.Size(66, 21);
            this.btnLetterC.TabIndex = 0;
            this.btnLetterC.Text = "The \"C\"";
            this.btnLetterC.UseVisualStyleBackColor = true;
            this.btnLetterC.Click += new System.EventHandler(this.btnLetterC_Click);
            // 
            // MyUserControlWithButtons
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.AutoSize = true;
            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            this.Controls.Add(this.btnLetterC);
            this.Controls.Add(this.btnLetterB);
            this.Controls.Add(this.btnLetterA);
            this.Name = "MyUserControlWithButtons";
            this.Size = new System.Drawing.Size(135, 81);
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Button btnLetterA;
        private System.Windows.Forms.Button btnLetterB;
        private System.Windows.Forms.Button btnLetterC;
    }
}

Form1.cs的

using System.Windows.Forms;

namespace ReusingUserControlsSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            mykeyboard.TheOutput = mytextbox;
        }
    }
}

Form1.Designer.cs

namespace ReusingUserControlsSample
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.mytextbox = new System.Windows.Forms.TextBox();
            this.mykeyboard = new ReusingUserControlsSample.MyUserControlWithButtons();
            this.SuspendLayout();
            // 
            // mytextbox
            // 
            this.mytextbox.Location = new System.Drawing.Point(84, 38);
            this.mytextbox.Name = "mytextbox";
            this.mytextbox.Size = new System.Drawing.Size(100, 20);
            this.mytextbox.TabIndex = 0;
            // 
            // mykeyboard
            // 
            this.mykeyboard.AutoSize = true;
            this.mykeyboard.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            this.mykeyboard.Location = new System.Drawing.Point(66, 122);
            this.mykeyboard.Name = "mykeyboard";
            this.mykeyboard.Size = new System.Drawing.Size(135, 81);
            this.mykeyboard.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.Controls.Add(this.mykeyboard);
            this.Controls.Add(this.mytextbox);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox mytextbox;
        private MyUserControlWithButtons mykeyboard;
    }
}

Program.cs的

using System;
using System.Windows.Forms;

namespace ReusingUserControlsSample
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

答案 1 :(得分:1)

创建UserControl并在其上放置虚拟号码组组/按钮。然后在每个表单上删除新的usercontrol,代替现有的groupbox / buttons。

答案 2 :(得分:1)

您有两种选择:

  • 创建一个名为“VirtualKeypad”的UserControl,然后在那里移动GroupBox和键盘按钮,然后在两个表单上使用(放置)新的“VirtualKeypad”控件。你的控件必须暴露一些事件,或者有一个属性来告诉它将文本放在哪个文本框等等。

  • 或者,如果您只想拥有一个键盘,则会遇到麻烦。键盘必须是一个,但键盘按钮如何知道输入文本的位置?您必须收听焦点更改,以便在单击/触摸文本框(第一个或第二个),然后单击/触摸键盘时,键盘将必须检查谁在他之前有焦点(旧焦点是文本框第一个或第二个)然后将数字/字母放在那里。这样做有点棘手。另外,如果你是WinForms的初学者,你可能会遇到两个独立窗口之间通信的问题。我建议您首先尝试使用UserControl。

答案 3 :(得分:1)

我建议只是复制它(最好将它全部复制到一个新的用户控件中,比如Dan-o说,然后只是放在每个表单上),然后交换哪个是可见的。但是,要直接回答您的问题,您只需修改其控件集合即可在表单之间移动控件:

//FormA
FormB formBInstance;
void button_OnClick(object sender, EventArgs e){
    Controls.Remove(myControl);
    formBInstance.Controls.Add(myControl);
}

但是你在任何特定的时间都有管理哪种形式的隐含困难我建议你永远不要在这样的形式之间交叉控制,除非你真的需要(如果你认为你做,通常是一种更容易的方式。)

既然你一步一步地问过,这里没有人可以做到,heres an explaination of user controls应该有所帮助。之后,只需从您的工具箱中选择它,就像您对任何其他控件一样,并在每个表单上进行制作。 (如果你真的需要他们表现得像一个人那样,设置一些可以切换的东西)。

答案 4 :(得分:1)

就是这样!它没有用,因为按钮只是坐在那里你可能没有编写任何代码来处理新控件中的点击。您必须将WHOLE组框/按钮移动到控件,以及处理它的所有WHOLE代码:所有事件处理程序,所有格式化程序等,您在第一个表单上为键盘工作所做的所有操作 - 现在必须移动到UserControl。 / p>

但这不是结束!当按钮单击发生时,键盘处理代码会在文本框中添加文本,对吧?现在,在您的usercontrol中,将没有文本框。

您的新美丽控件必须从文本框中抽象。理想情况下,它应该假设根本就会有任何文本框,但让我们跳过它。在新用户控件的代码中,放置一个类似于public TextBox MyOutputTextbox {get;set}的新属性。现在,让我们操作该属性这是您的文本框,它将获取所有文本并相应地修复您的UserControl代码。然后将控件放在表单上。然后确保Form的构造函数BOTH将文本框分配给该属性:

public Form1() {
    InitializeComponent();
    myKeyPadControl.MyOutputTextbox = txtFirstBox;
}

它应该有用。