Вы можете делать то, что сказал thelost, или вы можете реализовать свой собственный базовый класс формы, чтобы справиться с этой задачей.
public class BaseForm : Form
{
public BaseForm()
{
this.Load += new EventHandler(BaseForm_Load);
}
void BaseForm_Load(object sender, EventArgs e)
{
this.HandleFocusTracking(this.Controls);
}
private void HandleFocusTracking(ControlCollection controlCollection)
{
foreach (Control control in controlCollection)
{
control.GotFocus += new EventHandler(control_GotFocus);
this.HandleFocusTracking(control.Controls);
}
}
void control_GotFocus(object sender, EventArgs e)
{
_activeControl = sender as Control;
}
public virtual Control ActiveControl
{
get { return _activeControl; }
}
private Control _activeControl;
}
Невозможно избежать итерации управления, но если вы сделали это таким образом, итерация будет происходить только один раз, а не каждый раз, когда вы захотите узнать активный элемент управления. Затем вы можете просто вызвать ActiveControl в соответствии со стандартным приложением winforms следующим образом:
Control active = this.ActiveControl;
Единственный недостаток - это то, что если у вас было требование добавить новые элементы управления во время выполнения, вам нужно было бы убедиться, что они правильно подключены к событию control_GotFocus
.