如何创建具有一些常见功能的自定义C#控件?

如何创建具有一些常见功能的自定义C#控件?,c#,winforms,C#,Winforms,我对C#编程非常陌生。我来自autoit和其他脚本语言,这种转换是最困难的。无论如何,我正在windows窗体中处理一个控件,基本上我希望它是一个LinkLabel控件,当你单击它时,它将成为一个文本框,一旦你输入你的名字,点击enter或tab,它将把你的名字设置为LinkLabel。但是,我将在一个窗体上有10个这样的控件,按照我的方式,每个控件有三个方法,所以这是很多代码,我肯定我只是做错了,但我有: namespace Program { public partial class

我对C#编程非常陌生。我来自autoit和其他脚本语言,这种转换是最困难的。无论如何,我正在windows窗体中处理一个控件,基本上我希望它是一个LinkLabel控件,当你单击它时,它将成为一个文本框,一旦你输入你的名字,点击enter或tab,它将把你的名字设置为LinkLabel。但是,我将在一个窗体上有10个这样的控件,按照我的方式,每个控件有三个方法,所以这是很多代码,我肯定我只是做错了,但我有:

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,直到您准备好显示它为止