1

我正在尝试清理我的编码实践,但遇到了我无法解决的问题。

使用严格的选项,您如何找到表单的实例并在所述实例上运行公共子?

例如,在库存包中,我有一个结帐零件的快捷方式,它会查找结帐表单是否打开并运行 Checkout.AddID(ID as Integer)。例如:

For Each Form In Application.OpenForms
    If Form.Name = "FRMCheckout" Then
        Form.AddIDToList(PartID)
    End If
Next

这适用于选项严格关闭。但是,打开它并对其进行修改以适应例如:

For Each Form As Windows.Forms.Form In Application.OpenForms
    ' If Form.Name = "FRMCheckout" Then EDIT: Dropped this in leu of this:
    If TypeOf (Form) Is FRMCheckout Then
        Form.AddIDToList(Ctype(PartID, Integer))
    End If
Next
     

抛出错误(显然).AddIDToList 不是 Forms.form 的成员。

For Each Form as ProgramNamespace.FRMCheckout当 for 循环遇到正常形式时,更改为会抛出“无法将类型形式转换为 FRMcheckout”。

在不关闭选项严格的情况下完成此操作的方法是什么?

4

2 回答 2

3

寻找OfType 可枚举扩展,代码就是

For Each checkout In Application.OpenForms.OfType(Of FRMCheckout)()
    checkout.AddIDToList(Ctype(PartID, Integer))
Next

现在循环只返回 FRMCheckout 类型的形式,并且迭代器变量已经是强类型的,因此您可以调用它的公共方法和属性而无需任何转换。当然,所有繁重的工作都是在 OfType 扩展中完成的,因此如果预期有任何改进的话,它并没有真正提高性能,而只是一种更清晰的方式来编写和理解一段代码

于 2016-07-09T09:21:15.633 回答
2

所以我发现以下是一个解决方案,在我看来看起来更整洁:

Option Strict On

For Each Form As Windows.Forms.Form In Application.OpenForms
   If TypeOf (Form) Is FRMCheckout Then
        Dim Checkout_Instance As FRMCheckout = CType(Form, FRMCheckout)
        Checkout_Instance.AddIDToList(PartID.ToString)
   End If
Next

这行得通。

于 2016-07-09T09:16:26.470 回答