Как иметь общий Sub для определенной цели для всех текстовых полей? - PullRequest
1 голос
/ 22 мая 2011

Я создаю приложение C # WinForms в VS 2010. У меня есть 10 TextBoxes.

Для TextBox1, я обработал события для GotFocus, LostFocus и т. Д. Следующим образом:

this.richTextBox1.GotFocus += new System.EventHandler(this.RichTextBox1_GotFocus);
this.richTextBox1.LostFocus += new System.EventHandler(this.RichTextBox1_LostFocus);

private void TextBox1_GotFocus(object sender, System.EventArgs e)
{
    TextBox1.BackColor = Color.White;
}

private void TextBox1_LostFocus(object sender, System.EventArgs e)
{
    TextBox1.BackColor = Color.LightSteelBlue;
}

И теперь мне нужно написать один и тот же код для всех моих текстовых полей.Возможно ли вместо этого иметь общий метод обработчика событий GotFocus, LostFocus и т. Д. Для всех текстовых полей, чтобы выполнять вышеуказанные действия?

Ответы [ 3 ]

3 голосов
/ 22 мая 2011

Если вам действительно нужно это для 10 различных текстовых полей, лучший (и наиболее объектно-ориентированный) способ состоит в том, чтобы создать собственный настраиваемый элемент управления текстовым полем, который наследуется от System.Windows.Forms.TextBox.

Поскольку вы наследуете от базового TextBox класса, вы получаете все его функции бесплатно, а также можете реализовать желаемое поведение. Затем просто используйте этот пользовательский элемент управления в качестве замены для стандартного текстового элемента управления везде, где вы хотите элементы управления с этим поведением в вашей форме. Таким образом, вам не нужно вообще добавлять обработчики событий! Поведение встроено прямо в ваш контроль, следуя правилам инкапсуляции и не повторяйте себя.

Образец класса:

public class FocusChangeTextBox : TextBox
{
    public FocusChangeTextBox()
    {
    }

    protected override void OnGotFocus(EventArgs e)
    {
        // Call the base class implementation
        base.OnGotFocus();

        // Implement your own custom behavior
        this.BackColor = SystemColors.Window;
    }

    protected override void OnLostFocus(EventArgs e)
    {
        // Call the base class implementation
        base.OnLostFocus();

        // Implement your own custom behavior
        this.BackColor = Color.LightSteelBlue;
    }
}
2 голосов
/ 22 мая 2011

Конечно:
Просто создайте «нормальные» методы GotFocus, LostFocus и т. Д. И позвольте событиям всех текстовых полей вызывать эти методы.


EDIT:

Хорошо, вот и вы:

private void Form1_Load(object sender, EventArgs e)
{
    this.textBox1.GotFocus += new System.EventHandler(this.AllTextBoxes_GotFocus);
    this.textBox2.GotFocus += new System.EventHandler(this.AllTextBoxes_GotFocus);

    this.textBox1.LostFocus += new System.EventHandler(this.AllTextBoxes_LostFocus);
    this.textBox2.LostFocus += new System.EventHandler(this.AllTextBoxes_LostFocus);
}

private void AllTextBoxes_GotFocus(object sender, System.EventArgs e)
{
    if (sender is TextBox)
    {
        ((TextBox)sender).BackColor = Color.White;
    }
}

private void AllTextBoxes_LostFocus(object sender, System.EventArgs e)
{
    if (sender is TextBox)
    {
        ((TextBox)sender).BackColor = Color.LightSteelBlue;
    }
}

Существует только один метод для GotFocus и только один метод для LostFocus.
Есть два текстовых поля, и события обоих вызывают один и тот же метод GotFocus и LostFocus.
Методы GotFocus и LostFocus имеют ссылку на то, кто их вызвал (первый параметр «отправитель», поэтому они знают, какое текстовое поле нужно изменить.

1 голос
/ 22 мая 2011

Вы можете создать собственное текстовое поле и использовать его вместо копирования одного и того же вызова обработки для каждого текстового поля.Пожалуйста, посмотрите на эту ссылку для аналогичной идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...