neurotix шел по правильному пути, но он не будет ловить ваши текстовые поля в дочерних контейнерах, и при этом он не будет обрабатывать вызов правильной функции для установки свойств правильного текстового поля. Лучший способ справиться с этим без пользовательского элемента управления - использовать рекурсивную функцию для назначения обработчика событий.
public void SetTextBoxClickHandler(Control control)
{
foreach (Control childControl in control.Controls)
{
if (childControl is TextBox)
{
childControl.Click += this.MyClickHandler;
continue;
}
if (item.Controls == null)
continue;
SetTextBoxClickHandler(childControl);
}
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
typeof(Form).InvokeMember(string.Format("{0}s", ((Control)sender).Name), BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, null, new object[] { Clipboard.GetText() });
}
private void Form1_Load(object sender, EventArgs e)
{
SetTextBoxClickHandler(this.Controls);
}
Если вы используете пользовательский элемент управления, это действительно просто, просто наследуйте от TextBox и установите все, чтобы использовать новый элемент управления.
public class ClickableTextBox : TextBox
{
public ClickableTextBox()
{
this.Click += MyClickHandler;
}
void setText(string input)
{
this.ForeColor = Color.Black;
this.Text = input;
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
setText(Clipboard.GetText());
}
}
Я рекомендую создать пользовательский элемент управления по следующим причинам:
- Избегайте снижения производительности при использовании отражения для динамического вызова метода на основе его имени
- Избегайте снижения производительности при преобразовании отправителя объекта в элемент управления при каждом нажатии
- Избегайте снижения производительности во время цикла инициализации проверки каждого элемента управления и дочернего элемента управления в форме, независимо от того, является ли это TextBox или нет
- Меньше кода для обслуживания
- Более высокая возможность повторного использования, код формы, должна присутствовать в каждой форме. Если вам потребуется повторно использовать ее в другом проекте или другой форме, было бы намного проще повторно использовать пользовательский элемент управления, а не копировать / вставка кода в каждую форму, которая может потребоваться изменить
Конечно, если все, что вам нужно сделать, это установить текст и ничего больше в этой функции, вы могли бы немного упростить его ...
public void SetTextBoxClickHandler(Control control)
{
foreach (Control childControl in control.Controls)
{
if (childControl is TextBox)
{
childControl.Click += this.MyClickHandler;
continue;
}
if (item.Controls == null)
continue;
SetTextBoxClickHandler(childControl);
}
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
TextBox textBox = sender as Textbox;
if (textBox == null)
return;
textBox.ForeColor = Color.Black;
textBox.Text = Clipboard.GetText();
}
private void Form1_Load(object sender, EventArgs e)
{
SetTextBoxClickHandler(this.Controls);
}
или с помощью пользовательского элемента управления:
public class ClickableTextBox : TextBox
{
public ClickableTextBox()
{
this.Click += MyClickHandler;
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
this.ForeColor = Color.Black;
this.Text = input;
}
}
По многим из вышеперечисленных причин я по-прежнему рекомендую пользовательский элемент управления.