【问题标题】:How to show a GroupBox and its content on another form?如何在另一个表单上显示 GroupBox 及其内容?
【发布时间】:2012-08-08 06:09:02
【问题描述】:

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

我想在第二个表单上使用我的虚拟小键盘。我该怎么做?

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

【问题讨论】:

    标签: c# winforms custom-component groupbox


    【解决方案1】:

    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。

    构建。

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

    就是这样。现在您可以构建并运行它,一切都应该没问题。请不要将“键盘”的整个代码都放在用户控件中。该表单仅将其设置为与 that 文本框一起使用。在第二种形式中,您可以以相同的方式执行此操作:放置键盘、放置文本框、设置键盘以写入该文本框,它的工作方式相同。

    代码:

    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;
        }
    }
    

    程序.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());
            }
        }
    }
    

    【讨论】:

    • Yuppi Yuppi 成功了。现在我有机会尝试你所说的所有事情。我按照你说的一步一步做了。 (您帮助我编写了 MyUserControlWithButtons.cs 和 Form1.cs 等代码......所以感谢您的解释性很强,并发送代码进行检查)我希望您的教程为像我这样的所有新手提供路线图。我希望搜索此用户控件内容的人将从您的教程中受益。
    • 只有两个小问题:-我怎样才能让这个 usercontrol 组件永远留在 vstudio 上,或者我怎样才能让这个组件到我的其他解决方案中?因为当我打开另一个新解决方案时,该组件会从工具箱中取出。问题:-假设我想限制用户可以输入到文本框中的字符数,或者进行其他专业化或限制。我将在哪里编码?在 Form1.cs 或 MyUserControlWithButtons.cs 中?谢谢。
    • 1) 当您“构建”您的项目时,您的新组件将被打包到构建过程中创建的 .EXE/.DLL 文件中。它是 .exe 还是 .dll 取决于项目类型。通常,“应用程序”项目提供 .exe,“类库”提供 .dll。一旦您创建了一个新的解决方案/项目,其他“旧”项目就会被遗忘。但是,您可以对它们“添加引用” - 只需右键单击您的新项目,选择添加引用,然后选择 BROWSE 并指出您当时构建的 .EXE/.DLL 文件。之后,在重建之后,控件应该会显示出来。
    • 如果它出现了,它仍然只会出现在那个有“AddReference”的项目中。但是,如果您非常喜欢您的新控件,您甚至可以在 VisualStudio 中注册它,因此它会一直显示,请参阅stackoverflow.com/questions/4564576/…dhavalupadhyaya.wordpress.com/2008/07/20/… 了解初学者。您仍然需要将控件放在 DLL 或 EXE 中。或者,您也可以将原始项目添加到同一解决方案中并设置对项目的引用。
    • 2) 这在很大程度上取决于您实际想要达到的目标。将其放入 Forms 将意味着 Form1 和 Form2 将能够具有**不同*8 限制。通过将其放入控件中,您只需编写一次,但限制将被重复使用,并且将完全 100% 相同。
    【解决方案2】:

    创建一个UserControl 并将您的虚拟数字键盘组框/按钮放在上面。然后在每个表单上放置新的用户控件来代替现有的组框/按钮。

    【讨论】:

    • 我已经尝试制作一个用户控件并添加到我的工具箱并尝试使用它,但是当我无法管理它时。首先,我将自定义控件项添加到我的解决方案中,然后将 groupbbox 拖放到 costumcontrol1.cs[Design] 中,然后在 costumcontrol1.cs[Design] 中拖放一个按钮(因为我的组框中有按钮),然后我建造了它。我在我的工具箱菜单上看到了组件,但是当我拖放时它不起作用。 (问题是我没有写任何代码,甚至没有在 costomcontrol1.cs 中写什么。
    • 我的虚拟数字键盘可以完美地与一种形式配合使用,但我也想在另一种形式上使用它,因为我在那里做同样的工作)如果有人启发我会很高兴。从文档中没有太多了解。这就是我问这些步骤的原因。
    • 感谢您的帮助。 Quetzalcoatl 努力工作并制作了文档教程,如果您愿意,您也可以查看他的教程。我感谢大家的努力和帮助。
    【解决方案3】:

    你有两个选择:

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

    • 或者,如果您只想拥有一个键盘,那么您就有麻烦了。小键盘必须是一个,但是您的小键盘按钮如何知道将输入的文本放在哪里?您将不得不聆听焦点的变化,因此当您单击/触摸文本框(第一个或第二个),然后单击/触摸键盘时,键盘将不得不检查谁在他之前拥有焦点(旧的焦点是文本框第一个或第二个),然后将数字/字母放在那里。这会有点棘手。另外,如果您是 WinForms 的初学者,您可能会遇到两个独立窗口之间的通信问题。我建议您先尝试使用 UserControl。

    【讨论】:

    • 我已经尝试制作一个用户控件并添加到我的工具箱并尝试使用它,但是当我无法管理它时。首先,我将自定义控件项添加到我的解决方案中,然后将 groupbbox 拖放到 costumcontrol1.cs[Design] 中,然后在 costumcontrol1.cs[Design] 中拖放一个按钮(因为我的组框中有按钮),然后我建造了它。我在我的工具箱菜单上看到了组件,但是当我拖放时它不起作用。 (问题是我没有写任何代码,甚至没有在 costomcontrol1.cs 中写什么。
    • 我的虚拟数字键盘可以完美地与一种形式配合使用,但我也想在另一种形式上使用它,因为我在那里做同样的工作)如果有人启发我会很高兴。从文档中没有理解太多。这就是我问这些步骤的原因。
    【解决方案4】:

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

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

    但是,您在任何给定时间管理哪个表单都存在隐含的困难,我建议您不要在这样的表单之间交叉控件,除非您确实需要(如果您认为这样做,通常会有一个更容易方式)。

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

    【讨论】:

    • 我已经尝试制作一个用户控件并添加到我的工具箱并尝试使用它,但是当我无法管理它时。首先,我将自定义控件项添加到我的解决方案中,然后将 groupbbox 拖放到 costumcontrol1.cs[Design] 中,然后在 costumcontrol1.cs[Design] 中拖放一个按钮(因为我的组框中有按钮),然后我建造了它。我在我的工具箱菜单上看到了组件,但是当我拖放时它不起作用。 (问题是我没有写任何代码,甚至没有在 costomcontrol1.cs 中写什么。
    • 我的虚拟数字键盘可以完美地与一种形式配合使用,但我也想在另一种形式上使用它,因为我在那里做同样的工作)如果有人启发我会很高兴。从文档中没有太多了解。这就是我问这些步骤的原因。
    • 在控件中编写您通常在最初的表单中拥有的所有代码。您基本上采用设计(您已经完成的那些控件)和代码(我假设您最初在表单上拥有的事件处理程序)并将其放在控件后面的代码中。确保您没有在表单上留下任何代码,因为复制设计时不会复制。
    • 所以我复制 form1.cs 中的原始组框代码并粘贴到 cotomcontrol1.cs[Design] 中,然后复制 form1.cs[Design] 中的代码并粘贴再次进入costumcontrol1.cs[Design](在第一个复制代码下?)然后buit呢?我理解正确吗?如果我理解错了,你可以用一个组合框和一个按钮做一个小演示,如果它不多的话。谢谢。
    • 我相信这是正确的。它不起作用的原因是因为您移动了 design(组框等),而不是 behaviour,即常规“.cs”文件中的代码(代码隐藏)告诉该组框,文本框等做什么。
    【解决方案5】:

    原来如此!它没有起作用,因为按钮只是坐在那里,并且您可能没有编写任何代码来处理新控件中的点击。您必须将整个组框/按钮移动到控件,以及处理它的整个代码:所有事件处理程序、所有格式化程序等,您在第一个表单上所做的一切以使键盘工作 - 现在必须移动到 UserControl。

    但这还没有结束!当点击按钮时,您的键盘处理代码会向文本框添加文本,对吗?现在,在您的用户控件中,将没有文本框。

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

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

    它应该可以工作。

    【讨论】:

    • 创建一个“TextBox”类型的属性是一种不好的风格。理想情况下,它应该是一个事件“NewTextEntered”或一个字符串属性“EnteredText”,你的文本框将“绑定”到。然而,我无法解释一切。有很多关于创建自定义控件的很好的教程。尝试从 MSDN 示例或 CodeProject 文章开始!
    • :( 我认为它太高级了。但会很高兴学习你所说的东西。你知道一个好的 youtube 教程或文档教程,它一步一步地展示截图?或者没有这样的视频,你可以为新手做一个非常小的示例并发布并提供链接,以便我们可以作为参考。如果它不多,如果它对你来说不是那么复杂。和如果你现在有很多时间,你可以在这个周末发布并把它放在这里作为参考,这样当人们搜索商品时,他们会看到你的文档或视频。谢谢
    • 给你.. 一步一步,用最简单的方式做你想做的事。它不漂亮,但简短、连贯、简单且有效。代码要清晰,但也尽量自己做步骤。
    • Yuppi Yuppi 成功了。现在我有机会尝试你所说的所有事情。我按照你说的一步一步做了。 (您帮助我编写了 MyUserControlWithButtons.cs 和 Form1.cs 等代码......所以感谢您的解释性很强,并发送代码进行检查)我希望您的教程为像我这样的所有新手提供路线图。我希望搜索此用户控件内容的人将从您的教程中受益。
    • 只有两个小问题:-我怎样才能让这个 usercontrol 组件永远留在 vstudio 上,或者我怎样才能让这个组件到我的其他解决方案中?因为当我打开另一个新解决方案时,该组件会从工具箱中取出。问题:-假设我想限制用户可以输入到文本框中的字符数,或者进行其他专业化或限制。我将在哪里编码?在 Form1.cs 或 MyUserControlWithButtons.cs 中?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2018-08-25
    • 2015-05-14
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多