У меня есть куча TextBox в моем WinForm UserControl. Каждый из этих текстовых полей имеет несколько обработчиков событий, таких как On_Enter - показывает ListBox с предложениями, On_KeyUP - if Keys.Code == Keys.Enter
- SelectNextControl(). Когда я размещаю этот элемент управления в форме, ни одно из этих событий не срабатывает. Как вывести все эти события в содержащую форму? Как заставить события UserControl запускать обработчики событий этого UserControl?Expose всех обработчиков событий UserControl
ответ
Так что, если я понимаю правильно, я думаю, что есть 2 способа вы можете исходящее:
подход 1
В UserControl, установите Модификаторы свойство каждого текстового поля (или те, которые вы находитесь заинтересованы в) общественности:
Затем в форме, использующей этот UserControl вы можете получить доступ ко всем этим и, следовательно, текстовые поля свои события:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
myUserControl1.textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown);
}
}
подход 2 (Взято из this post)
Вы можете создавать новые события для вашего UserControl, которые просто проходят вперед событие нижележащего текстовое поле. Затем базовые текстовые поля остаются закрытыми для UserControl.
В UserControl добавить это событие:
public event KeyEventHandler TextBox1KeyDown
{
add { textBox1.KeyDown += value; }
remove { textBox1.KeyDown -= value; }
}
Или вы можете создать одно событие, которое имеет дело со всеми текстовыми полями:
public event KeyEventHandler AnyTextBoxKeyDown
{
add
{
textBox1.KeyDown += value;
textBox2.KeyDown += value;
textBox3.KeyDown += value;
...
}
remove
{
textBox1.KeyDown -= value;
textBox2.KeyDown -= value;
textBox3.KeyDown -= value;
...
}
}
Теперь ваш UserControl имеет событие своей собственной, что код в форме можно использовать:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
myUserControl1.TextBox1KeyDown += new KeyEventHandler(myUserControl1_TextBox1KeyDown);
myUserControl1.AnyTextBoxKeyDown += new KeyEventHandler(myUserControl1_AnyTextBoxKeyDown);
}
private void myUserControl1_TextBox1KeyDown(object sender, KeyEventArgs e)
{
/* We already know that TextBox1 was pressed but if
* we want access to it then we can use the sender
* object: */
TextBox textBox1 = (TextBox)sender;
/* Add code here for handling when a key is pressed
* in TextBox1 (inside the user control). */
}
private void myUserControl1_AnyTextBoxKeyDown(object sender, KeyEventArgs e)
{
/* This event handler may be triggered by different
* textboxes. To get the actual textbox that caused
* this event use the following: */
TextBox textBox = (TextBox)sender;
/* Add code here for handling when a key is pressed
* in the user control. */
}
}
Обратите внимание, что хотя этот подход сохраняет текстовые поля частными w В UserControl они все равно могут быть доступны из обработчика событий аргументом sender
.
thanx так много для вашего ответа. Однако у меня еще два вопроса. Какой тип myUserControl1_AnyTextBoxKeyDown и где следует объявить? Я предполагаю, что это «делегат», но не совсем уверен, куда должно идти это определение. – ArtK
@ArtK, 'myUserControl1_AnyTextBoxKeyDown' - метод, который используется для обработки события. Если вы используете Visual Studio, то после создания нового события для вашего пользовательского элемента управления (в этом примере «событие AnyTextBoxKeyDown») оно должно появиться в intielisence, и по мере ввода «+ = new» оно должно предложить заполнить отдых для вас. Если вы позволите ему заполнить остальные, он автоматически создаст новый метод. Это должно идти в классе формы, который имеет пользовательский контроль. – Ben
В моем примере я помещал регистрацию события в конструктор формы, и это, как правило, лучшее место, но иногда вы можете захотеть поместить это в другое место в зависимости от требований. – Ben
Любой код, который будет полезен –
@valter - это абстрактный вопрос, код будет неактуальным – ArtK
Я думаю, что причина, по которой у вас пока нет ответов на ваш вопрос, заключается в том, что большинство людей, отвечающих здесь, любят видеть попытку при поиске решения, прежде чем они ответят. Лично, если я понимаю вас правильно, я думаю, что ваш вопрос не является абстрактным, но является общей практической проблемой. Было бы неплохо, если бы вы разместили какой-то код, чтобы показать, что вы пробовали. Во всяком случае, я постараюсь ответить на это за вас. – Ben