Я расскажу свое требование. Мне нужно иметь keydown
событие для каждого элемента управления в форме Windows Forms. Лучше сделать это, а не вручную делать это для всех элементов управления, если то, что я должен делать для всех событий, связанных с keydown, одинаково.
Поэтому я мог бы в принципе сделать это:
foreach (Control c in this.Controls)
c.KeyDown+= new KeyEventHandler(c_KeyDown);
Но здесь, foreach не зацикливается внутри тех элементов управления, которые находятся внутри groupBox или tabControl. Я имею в виду, если форма (это) содержит groupBox или какой-либо другой элемент управления контейнером, тогда я могу получить событие keydown для этого конкретного элемента управления контейнером. И foreach
не управляет элементами управления, которые находятся внутри этого элемента управления контейнером.
Вопрос 1: Как получить событие смены ключа для "всех" элементов управления в форме?
Если эта головоломка решена, моя проблема завершена.
Это то, что я могу сделать иначе:
В основном псевдо-код
foreach (Control c in this.Controls)
{
c.KeyDown += new KeyEventHandler(c_KeyDown);
if (c is Container control)
FunctionWhichGeneratesKeyDownForAllItsChildControls(c)
}
Я знаю, что мне придется много раз проходить через FunctionWhichGeneratesKeyDownForAllItsChildControls(c)
, чтобы получить keydown для всех элементов управления, если в групповом ящике есть групповые группы. Я могу это сделать. Мой вопрос:
Вопрос 2: Как проверить, является ли c
элементом управления контейнером?