我有这些功能:
private void setupFocusControls(Control parent)
{
foreach (Control control in parent.Controls)
{
control.GotFocus += HandleFocus;
}
}
private void HandleFocus(object sender, EventArgs e)
{
Control control = (Control)sender;
thisFormName = this.Name;
thisControlName = control.Name.ToString();
if (bHelpSystemActive)
{
bHelpSystemActive = false;
if ((ModifierKeys & Keys.Control) == Keys.Control)
{
HelpSystem hs = new HelpSystem(thisFormName, thisControlName);
hs.ShowDialog();
}
else
{
showTooltipForControl(control, thisFormName);
}
return;
}
}
我在Form_Load函数中调用它:
private void Labeller_Load(object sender, EventArgs e)
{
setupFocusControls(this);
fillListBox();
}
这样做是为了展示我写过的自定义帮助系统。如果没有单击控制键,那么我将在工具提示中显示信息。如果按下控制键,则显示编辑器。很简单。
现在,这段代码完全适用于另一种形式,它使用面板作为表单控件的容器。问题是,我现在想要将此功能添加到单独的表单中。我添加了所有代码,但表单上没有任何控件添加了HandleFocus事件。这个表单和工作表单之间的唯一区别是它使用splitContainer作为它的容器。
我的问题是,为什么setupFocusControls
函数没有循环遍历splitContainer,因为它在我的工作表单上执行了面板操作?而且,我将如何修复它?我显然不会有几个函数来执行这个(我认为)简单的任务......
干杯。
答案 0 :(得分:2)
假设问题是您没有将事件分配给表单上的每个单个控件(仅限顶级控件),则修复应该是更改setupFocusControls(Control)
方法:
private void setupFocusControls(Control parent)
{
foreach (Control control in parent.Controls)
{
control.GotFocus += HandleFocus;
// add the following line to recurse throughout the control tree
setupFocusControls(control);
}
}
这将通过递归每个控件的子项,将HandleFocus
事件处理程序添加到每个单个控件。我希望这适合你!
作为奖励,如果您要将事件处理程序添加到所有控件,包括 parent
控件,您可以编写setupFocusControls
方法,如下所示:
private void setupFocusControls(Control parent)
{
parent.GotFocus += HandleFocus;
foreach (Control child in parent.Children)
setupFocusControls(child);
}