我通过窗体集合隐藏和显示窗体作为用户超时功能,并且需要在再次显示窗体时调用每个窗体中的公共方法,以便使用登录用户更新窗体(如果它发生更改)。
然而,我对此有异议,因为我似乎不能直接从表单集合的迭代中完成此操作。有人有什么建议吗?
这是我正在工作的代码。任何帮助都非常感谢!
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
if (frm.Visible == false && frm.Name != "FStart" && frm.Name != "FMain")
{
//Here I would like to call frm.UpdateUser(.....);
frm.Show();
}
}
感谢大家的帮助,这个方法在每一种形式中都是一个公共的空白。
我尝试从窗体集合访问公共方法,并且尝试直接访问该方法。
2条答案
按热度按时间wf82jlnq1#
代码中的第一个潜在问题是,您正在迭代
Application.OpenForms
集合,希望找到Visible==false
的示例。(取决于关闭的方法)可能不包含随后隐藏的表单。由于第一个循环条件可能计算为false
,不保证执行frm.Show()
行。一个解决方案是创建自己的Forms集合,然后迭代该集合。
第二个问题是,您的语法告诉编译器将循环对象解释为循环
foreach (Form frm in fc)...
中的Form
,但Form
类本身没有UserUpdate
方法。在调用UpdateUser
方法之前,我们需要确定集合中的特定继承类是支持UpdateUser
方法的类,还是支持一个健壮的方法是创建一个接口(我们可以称之为IUpdatableUserForm
),然后选择继承的Form
类中的哪一个来实现它。例如:现在,当您在Form上迭代集合时,可以确保 * 特定 * 继承的Form使用
is
运算符实现UpdateUser方法,并且仅在该方法存在时才调用该方法。(通过比较,如果dynamic
关键字遇到Form
的派生项,而该派生项不实现UpdateUser
,则该关键字将引发异常)。8qgya5xd2#
尝试使用dynamic keyword访问方法
UpdateUser
。下面是一个示例:请记住,当您使用
dynamic
关键字时,它并不关心您试图调用什么方法,也不关心您为它们提供了什么参数,所以在使用它时要小心。