0

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

我想在第二种形式上使用我的虚拟小键盘。我怎样才能做到这一点?

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

4

5 回答 5

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文本框' TextBoxs财产。请记住检查TheOutputNULL。

建造。

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

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

编码:

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());
        }
    }
}
于 2012-08-10T23:59:40.320 回答
1

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

于 2012-08-10T22:43:47.207 回答
1

你有两个选择:

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

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

于 2012-08-10T22:53:00.307 回答
1

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

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

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

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

于 2012-08-10T22:53:28.867 回答
1

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

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

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

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

它应该可以工作。

于 2012-08-10T23:22:53.210 回答