У меня есть класс пользовательского элемента управления, который имеет следующее поведение (довольно обычные вещи)Использование событий для передачи информации в родительской форме
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. Я не знаю, почему ...
Помогите оценить, конечно, надеюсь, вы видите, к чему я пытаюсь добраться.
Спасибо! Много разочарований решено (до сих пор). Не могли бы вы объяснить, почему именно activeControl не знал, что это C1, когда он назначен? –
Причина в том, что 'activeControl' объявлен как UserControl. Даже если вы назначили производный класс UserControl (например, C1), вы не можете получить доступ к членам C1 без нажатия 'activeControl'. – ReMinoer
Это можно объяснить тем, что вы можете присвоить другому классу, унаследованному UserControl (представьте себе класс C2), 'activeControl' между назначением C1 и подпиской на события. Вот почему Intellisense ждет вас, чтобы указать тип объекта с литой, без которой компилятор не может знать, что activeControl имеет тип C1. – ReMinoer