我有两种形式。在第一个表单上,我有一个虚拟小键盘(我有一个GroupBox
,里面有数字按钮,这是我的虚拟小键盘)。使用这个虚拟数字键盘,我将数字输入到TextBox
. 在第二种形式TextBox
中,我有另一个输入数字的地方。
我想在第二种形式上使用我的虚拟小键盘。我怎样才能做到这一点?
如果有人一步一步地向我解释我应该做什么,我会很高兴。
我有两种形式。在第一个表单上,我有一个虚拟小键盘(我有一个GroupBox
,里面有数字按钮,这是我的虚拟小键盘)。使用这个虚拟数字键盘,我将数字输入到TextBox
. 在第二种形式TextBox
中,我有另一个输入数字的地方。
我想在第二种形式上使用我的虚拟小键盘。我怎样才能做到这一点?
如果有人一步一步地向我解释我应该做什么,我会很高兴。
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
s财产。请记住检查TheOutput
NULL。
建造。
8) 返回 Form1
9) 放置MyUserControlWithButtons
在表单上,将其命名为“mykeyboard”
10) 在表单上放置一个 TextBox,将其命名为“mytextbox”
11) 转到 Form1 的代码
12) 在构造函数中,在“InitializeComponent”下方,将 mytextbox 分配给TheOutput
mykeyboard
就是这样。现在您可以构建并运行它,一切都应该没问题。请不要将“键盘”的整个代码都放在用户控件中。该表单仅将其设置为与该文本框一起使用。在第二种形式中,您可以以相同的方式执行此操作:放置键盘,放置文本框,设置键盘以写入该文本框,它的工作方式相同。
编码:
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());
}
}
}
创建一个UserControl
并将您的虚拟数字键盘组框/按钮放在上面。然后在每个表单上放置新的用户控件来代替现有的组框/按钮。
你有两个选择:
要么创建一个名为“VirtualKeypad”的用户控件,然后将 GroupBox 和键盘按钮移到那里,然后在两个表单上使用(放置)新的“VirtualKeypad”控件。您的控件必须公开一些事件,或者有一个属性可以告诉它将文本放在哪个文本框等。
或者,如果您只想拥有一个键盘,那么您就有麻烦了。小键盘必须是一个,但是您的小键盘按钮如何知道将输入的文本放在哪里?您将不得不聆听焦点的变化,因此当您单击/触摸文本框(第一个或第二个),然后单击/触摸键盘时,键盘将不得不检查谁在他之前拥有焦点(旧的焦点是文本框第一个或第二个),然后将数字/字母放在那里。这会有点棘手。另外,如果您是 WinForms 的初学者,您可能会遇到两个独立窗口之间的通信问题。我建议您先尝试使用 UserControl。
我建议只复制它(最好将它全部复制到一个新的用户控件中,就像 Dan-o 说的那样,然后放在每个表单上),然后交换可见的。但是,要直接回答您的问题,您可以通过修改控件集合在表单之间移动控件:
//FormA
FormB formBInstance;
void button_OnClick(object sender, EventArgs e){
Controls.Remove(myControl);
formBInstance.Controls.Add(myControl);
}
但是,您在任何给定时间管理哪个表单都存在隐含的困难,我建议您不要在这样的表单之间交叉控件,除非您确实需要(如果您认为这样做,通常有更简单的方法)。
既然你一步一步地问,这里没有人能真正做到,这里对用户控件的解释应该有所帮助。之后,只需从您的工具箱中选择它,就像您选择任何其他控件并在每个表单上制作一样。(如果你真的需要他们表现得像一个人一样,设置一些东西来切换它是可见的)。
就是这样!它没有工作,因为按钮只是坐在那里,并且您可能没有编写任何代码来处理新控件中的点击。您必须将整个组框/按钮移动到控件,以及处理它的整个代码:所有事件处理程序、所有格式化程序等,您在第一个表单上所做的一切以使键盘工作 - 现在必须移动到用户控件。
但这不是结束!当点击按钮时,您的键盘处理代码会向文本框添加文本,对吗?现在,在您的用户控件中,将没有文本框。
您的新漂亮控件必须从文本框中抽象出来。理想情况下,它应该 假设会有任何文本框,但让我们跳过它。在新用户控件的代码中,放置一个类似于 的新属性public TextBox MyOutputTextbox {get;set}
。现在,让我们执行该属性,这是您的文本框,它将获取所有文本并相应地修复您的 UserControl 代码。然后将您的控件放在表单上。然后确保您的表单的构造函数都将文本框分配给该属性:
public Form1() {
InitializeComponent();
myKeyPadControl.MyOutputTextbox = txtFirstBox;
}
它应该可以工作。