Как насчет этого?
// form constructor
public MyForm()
{
InitializeComponent();
this.textBo1.TextChanged += txt_TextChanged;
this.textBo2.TextChanged += txt_TextChanged;
this.textBo3.TextChanged += txt_TextChanged;
this.textBo4.TextChanged += txt_TextChanged;
}
// event handler
void txt_TextChanged(object sender, EventArgs e)
{
var textBox = (TextBox)sender;
this.myList.Add(textBox.Text);
}
РЕДАКТИРОВАТЬ:
(согласно обновлению вопроса)
На самом деле предыдущий код может быть легко изменен для создания одного делегата и передачи его всем текстовым полям, но он не меняется слишком сильно (все еще есть четыре подписки на события):
public MyForm()
{
InitializeComponent();
// EventHandler is defined as:
// delegate void EventHandler(object sender, EventArgs e)
// so its signature is equal to your delegate:
// delegate void ListenToTextBoxes(object sender, EventArgs e);
// Hence, if you receive that delegate from somewhere out, you can pass it
// to TextChange events
var myDelegate = new EventHandler(txt_TextChanged);
this.textBox1.TextChanged += myDelegate;
this.textBox2.TextChanged += myDelegate;
this.textBox3.TextChanged += myDelegate;
this.textBox4.TextChanged += myDelegate;
}
Проблема в том, что вам нужно подписать событие TextChanged
для каждого элемента управления TextBox
, волшебного способа , который бы говорил «зарегистрировать все события TextBox.TextChange для этого делегата», нет.
Но если вы уверены, что все текстовые поля, которые вы хотите зарегистрировать, являются дочерними элементами этого элемента управления, вы можете использовать цикл, например, :
public MyForm()
{
InitializeComponent();
var myDelegate = new EventHandler(txt_TextChanged);
foreach (var ctrl in this.Controls)
{
var txtBox = ctrl as TextBox;
if (txtBox != null)
txtBox.TextChanged += myDelegate;
}
}