如何创建具有一些常见功能的自定义C#控件?
我对C#编程非常陌生。我来自autoit和其他脚本语言,这种转换是最困难的。无论如何,我正在windows窗体中处理一个控件,基本上我希望它是一个LinkLabel控件,当你单击它时,它将成为一个文本框,一旦你输入你的名字,点击enter或tab,它将把你的名字设置为LinkLabel。但是,我将在一个窗体上有10个这样的控件,按照我的方式,每个控件有三个方法,所以这是很多代码,我肯定我只是做错了,但我有:如何创建具有一些常见功能的自定义C#控件?,c#,winforms,C#,Winforms,我对C#编程非常陌生。我来自autoit和其他脚本语言,这种转换是最困难的。无论如何,我正在windows窗体中处理一个控件,基本上我希望它是一个LinkLabel控件,当你单击它时,它将成为一个文本框,一旦你输入你的名字,点击enter或tab,它将把你的名字设置为LinkLabel。但是,我将在一个窗体上有10个这样的控件,按照我的方式,每个控件有三个方法,所以这是很多代码,我肯定我只是做错了,但我有: namespace Program { public partial class
namespace Program
{
public partial class formMain : Form
{
public formMain()
{
InitializeComponent();
}
private void linkLabelPlayerName1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
this.linkLabelPlayerName1.Hide();
this.textBoxPlayerName1.Show();
this.textBoxPlayerName1.Focus();
this.textBoxPlayerName1.KeyPress += new KeyPressEventHandler(textBoxPlayerName1_KeyPress);
this.textBoxPlayerName1.LostFocus += new EventHandler(textBoxPlayerName1_LostFocus);
}
private void textBoxPlayerName1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
this.linkLabelPlayerName1.Text = this.textBoxPlayerName1.Text;
this.textBoxPlayerName1.Hide();
this.linkLabelPlayerName1.Show();
}
}
private void textBoxPlayerName1_LostFocus(object sender, EventArgs e)
{
this.linkLabelPlayerName1.Text = this.textBoxPlayerName1.Text;
this.textBoxPlayerName1.Hide();
this.linkLabelPlayerName1.Show();
}
}
}
我确信有一种方法可以在所有10个控件之间使用最后两种方法,因此它们不必为每个控件重写。也就是说,
textBoxPlayerName1\u LostFocus()
和textBoxPlayerName2\u LostFocus()
使用该功能创建您自己的控件。使用该功能创建您自己的控件。您的代码是正确的
要使其更干净,应将其移动到单独的UserControl
,并将Text
属性设置为文本框的值。您的代码是正确的
要使其更干净,应将其移动到单独的UserControl
,并将Text
属性设置为文本框的值。欢迎使用面向对象编程:)
您应该创建一个派生类来封装功能。例如:
class EditableText : UserControl
{
private LinkLabel lblName;
private TextBox txtName;
public EditableText()
{
// Construct objects, attach events and add them
// as children to this object
}
// Return the text of encapsulated TextBox
public string Text
{
get { return txtName.Text; }
}
}
现在您可以在不同的领域重复使用这个类
,这就是面向对象编程的全部内容 欢迎使用面向对象编程:)
您应该创建一个派生类来封装功能。例如:
class EditableText : UserControl
{
private LinkLabel lblName;
private TextBox txtName;
public EditableText()
{
// Construct objects, attach events and add them
// as children to this object
}
// Return the text of encapsulated TextBox
public string Text
{
get { return txtName.Text; }
}
}
现在您可以在不同的领域重复使用这个类
,这就是面向对象编程的全部内容
右键单击SolutionExporer中的windows窗体应用程序,然后选择添加,然后选择用户控制
键入新控件的名称,如LinkLabelTextBox
这将为您提供一个看起来像表单但没有边界的工作空间。这是你的新控制。将LinkLable和TextBox完全按照您在窗口中放置的方式放置在此新控件上,并为它们提供所需的功能。然后用此新控件的实例替换所有现有控件。您将创建其中的10个,而不是创建10个链接标签和10个文本框。您想要的所有功能都将内置到新控件中,这样代码就不需要重复
您将使用linkLabelTextBoxPlayerName1,而不是linkLabelPlayerName1和textBoxPlayerName1,并且显示、隐藏和聚焦内容都不会使表单代码混乱
另外,请确保包含公共文本属性,以便可以获取用户在此控件外键入的值
右键单击SolutionExporer中的windows窗体应用程序,然后选择添加,然后选择用户控制
键入新控件的名称,如LinkLabelTextBox
这将为您提供一个看起来像表单但没有边界的工作空间。这是你的新控制。将LinkLable和TextBox完全按照您在窗口中放置的方式放置在此新控件上,并为它们提供所需的功能。然后用此新控件的实例替换所有现有控件。您将创建其中的10个,而不是创建10个链接标签和10个文本框。您想要的所有功能都将内置到新控件中,这样代码就不需要重复
您将使用linkLabelTextBoxPlayerName1,而不是linkLabelPlayerName1和textBoxPlayerName1,并且显示、隐藏和聚焦内容都不会使表单代码混乱
此外,请确保包含公共文本属性,以便您可以获取用户从该控件键入的值。我到处都可以看到这些动物示例,它们在原则上是说明性的,但在实际程序中很少以这种方式使用继承。如果您的示例直接与OP的代码相关(即继承自控件
),您的答案会更好。感谢您提供详细的示例,我将尝试这种方法和jeffery的方法。再次感谢大家的宝贵意见。我想我会喜欢这个论坛的@罗伯特:我同意,我已经更新了这个例子来扩展UserControl
类。我到处都能看到这些动物的例子,它们在原则上是说明性的,但在实际程序中,继承很少以这种方式使用。如果您的示例直接与OP的代码相关(即继承自控件
),您的答案会更好。感谢您提供详细的示例,我将尝试这种方法和jeffery的方法。再次感谢大家的宝贵意见。我想我会喜欢这个论坛的@罗伯特:我同意,我已经更新了这个例子来扩展UserControl
类。好的,我已经按照说明做了,但是我还有一个问题,如何将控件LinkLabelTextBox添加到我的表单?@string redLabel-啊,是的,这是一个很好的问题!构建您的项目,然后您可以将控件从解决方案导出器拖动到工具箱中。然后,在工具箱的顶部将有一个用于应用程序自定义控件的部分。你应该在那里找到你的新控件。你可以像其他控件一样从那里使用它。如果你得到这个,我有另一个问题,我需要一些方法来验证控件,即:一旦你传递了控件的参数,(输入一个null或空的值),我希望它创建另一个控件,并继续这样做,直到总共有10个控件。谢谢您的帮助。@string redLabel-您可以在代码中创建新控件并将其添加到表单中。或者,如果您知道有一个硬限制为10,那么您可以将每个控件的visible属性设置为false,直到您准备好显示它为止