2014-09-18 2 views
0

У меня есть куча TextBox в моем WinForm UserControl. Каждый из этих текстовых полей имеет несколько обработчиков событий, таких как On_Enter - показывает ListBox с предложениями, On_KeyUP - if Keys.Code == Keys.Enter - SelectNextControl(). Когда я размещаю этот элемент управления в форме, ни одно из этих событий не срабатывает. Как вывести все эти события в содержащую форму? Как заставить события UserControl запускать обработчики событий этого UserControl?Expose всех обработчиков событий UserControl

+0

Любой код, который будет полезен –

+0

@valter - это абстрактный вопрос, код будет неактуальным – ArtK

+0

Я думаю, что причина, по которой у вас пока нет ответов на ваш вопрос, заключается в том, что большинство людей, отвечающих здесь, любят видеть попытку при поиске решения, прежде чем они ответят. Лично, если я понимаю вас правильно, я думаю, что ваш вопрос не является абстрактным, но является общей практической проблемой. Было бы неплохо, если бы вы разместили какой-то код, чтобы показать, что вы пробовали. Во всяком случае, я постараюсь ответить на это за вас. – Ben

ответ

1

Так что, если я понимаю правильно, я думаю, что есть 2 способа вы можете исходящее:

подход 1

В UserControl, установите Модификаторы свойство каждого текстового поля (или те, которые вы находитесь заинтересованы в) общественности:

enter image description here

Затем в форме, использующей этот 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.

+0

thanx так много для вашего ответа. Однако у меня еще два вопроса. Какой тип myUserControl1_AnyTextBoxKeyDown и где следует объявить? Я предполагаю, что это «делегат», но не совсем уверен, куда должно идти это определение. – ArtK

+0

@ArtK, 'myUserControl1_AnyTextBoxKeyDown' - метод, который используется для обработки события. Если вы используете Visual Studio, то после создания нового события для вашего пользовательского элемента управления (в этом примере «событие AnyTextBoxKeyDown») оно должно появиться в intielisence, и по мере ввода «+ = new» оно должно предложить заполнить отдых для вас. Если вы позволите ему заполнить остальные, он автоматически создаст новый метод. Это должно идти в классе формы, который имеет пользовательский контроль. – Ben

+0

В моем примере я помещал регистрацию события в конструктор формы, и это, как правило, лучшее место, но иногда вы можете захотеть поместить это в другое место в зависимости от требований. – Ben