Поведение галстука
Вы можете привязать функцию / поведение ближе к элементу управления TextBox, используя методы расширения . Это простое решение может сделать его более сплоченным:
// NOTE: first parameter "this TextBox thisText"- these are all extension methods.
static public void AssignLabel(this TextBox thisText, Label companionLabel) {
thisText.Tag = companionLabel;
// HOOK UP EVENT AT THIS POINT, WHEN LABEL IS ASSIGNED (.NET 3.x)
thisText.Leave += (Object sender, EventArgs e) => {
LeaveMe(thisText); // Invoke method below.
};
}
static public void FocusText(this TextBox thisText) {
if (! ReferenceEquals(null, thisText.Tag))
(Label)thisText.Tag).Visible = false;
thisText.Focus();
}
static public void LeaveMe(this TextBox thisText) {
if (String.IsNullOrEmpty(thisText.Text))
((Label)thisText.Tag).Visible = true;
}
//etc.
и затем используйте ваши экземпляры текстового поля следующим образом:
Label overlay1 = new Label(); // Place these appropriately
Label overlay2 = new Label(); // on top of the text boxes.
Label overlay3 = new Label();
TextBox myTextbox1 = new TextBox();
TextBox myTextbox2 = new TextBox();
TextBox myTextbox3 = new TextBox();
// Note: Calling our extension methods directly on the textboxes.
myTextbox1.AssignLabel(overlay1);
myTextbox1.FocusText();
myTextbox1.LeaveMe();
myTextbox2.AssignLabel(overlay2);
myTextbox2.FocusText();
myTextbox2.LeaveMe();
myTextbox3.AssignLabel(overlay3);
myTextbox3.FocusText();
myTextbox3.LeaveMe();
//etc...
Как это работает
Код чище и применяется ко всем текстовым полям, которые вы создаете .
Он использует свойство .Tag класса TextBox для хранения ссылки Label (поэтому каждый TextBox знает свою метку), а также методы расширения , представленные в .NET. 3.x, которые позволяют нам «прикреплять» методы к самому классу TextBox, чтобы привязать к нему ваше поведение.
Я взял ваш код и произвел почти то же самое с настройками, чтобы превратить его в методы расширения и связать метку с вашим текстовым полем.
Изменение
Если вы хотите присоединить тот же метод к другим элементам управления (а не только к текстовому полю), тогда расширьте базовый элемент управления на сам класс, например:
static public void LeaveMe(this Control thisControl) { //...