2015-05-01 2 views
0

У меня есть класс пользовательского элемента управления, который имеет следующее поведение (довольно обычные вещи)Использование событий для передачи информации в родительской форме

public class C1 
{ 
    //controls with auto generated code in the designer file that I can access 
    //such as with the following action (for example) 
    string s1 = txtThing.Text; 
} 

Он создан (и разрушенный, вместе с другими классами) динамически через заехать в родительской форме, как:

public class MainForm 
{ 
    UserControl activeControl = null; 

    //...later on... 
    activeControl = new C1(params...) 
    //later on, as a new control is needed 
    panel.Controls.Clear(); 
} 

Мне нужно динамически добавить обработчик событий в текстовых полях текста изменился событие, а событие живет в классе MainForm. Поэтому я хочу сделать что-то вроде

activeControl.txtThing.TextChanged += new EventHandler(MyCustomHandler); 

Но текстовое поле явно закрыто. Если я создаю свойство it для его получения (или даже просто текст) в классе C1, я все еще не могу «получить» свойство control pr, которое мне нужно, и я понятия не имею, почему ... Единственные свойства, которые я могу видеть (с activeControl . в intellisense) являются стандартными свойствами управления пользователем и ни одним из свойств C1. Я не знаю, почему ...
Помогите оценить, конечно, надеюсь, вы видите, к чему я пытаюсь добраться.

ответ

0

После того, как вы создали свойство в классе C1, вам необходимо наложить activeControl.

if (activeControl is C1) 
    (activeControl as C1).TxtThingProperty.TextChanged += new EventHandler(MyCustomHandler); 
+0

Спасибо! Много разочарований решено (до сих пор). Не могли бы вы объяснить, почему именно activeControl не знал, что это C1, когда он назначен? –

+0

Причина в том, что 'activeControl' объявлен как UserControl. Даже если вы назначили производный класс UserControl (например, C1), вы не можете получить доступ к членам C1 без нажатия 'activeControl'. – ReMinoer

+0

Это можно объяснить тем, что вы можете присвоить другому классу, унаследованному UserControl (представьте себе класс C2), 'activeControl' между назначением C1 и подпиской на события. Вот почему Intellisense ждет вас, чтобы указать тип объекта с литой, без которой компилятор не может знать, что activeControl имеет тип C1. – ReMinoer