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

时间:2011-04-04 17:49:07

标签: c# winforms

我是C#编程的新手。我来自autoit和其他脚本语言,过渡一直是最困难的。无论如何我正在使用Windows窗体中的控件,基本上我希望它是一个LinkLabel控件,当你点击它时,它将成为一个文本框,一旦你输入你的名字,然后点击回车或标签,它将将您的名称设置为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_LostFocus()textBoxPlayerName2_LostFocus()

4 个答案:

答案 0 :(得分:2)

欢迎使用面向对象的编程:)。

您应该创建一个派生类来封装功能。例如:

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,这就是面向对象编程的全部内容!

答案 1 :(得分:1)

  1. 右键单击Solution Exporer中的Windows窗体应用程序,然后选择添加,然后选择用户控件...
  2. 键入新控件的名称,例如LinkLabelTextBox
  3. 这将为您提供一个工作空间,看起来像一个Form,但没有边框。这是你的新控件。将LinkLable和TextBox放在这个新控件上,就像将它们放在窗口中一样,并为它们提供所需的功能。然后使用此新控件的实例替换所有现有控件。您将创建其中的10个,而不是创建10个LinkLabel和10个TextBox。并且您需要的所有功能都将内置到您的新控件中,因此不需要重复代码。

    而不是linkLabelPlayerName1和textBoxPlayerName1,你将拥有一个linkLabelTextBoxPlayerName1,而Show,Hide,Focus的东西都不会使你的表单代码混乱。

    此外,请务必包含公共Text属性,以便获取用户键入此控件的值。

答案 2 :(得分:0)

使用该功能创建您自己的Control

答案 3 :(得分:0)

您的代码是正确的。

为了使其更清晰,您应将其移至单独的UserControl,并将Text属性设置为文本框的值。