2016-07-09 3 views
1

간단히 말해서, 코딩 방법을 정리하려고하고 있는데 해결할 수 없었습니다.Strict 옵션을 사용하여 양식에서 서브 실행 ON

옵션을 엄격히 사용하면 양식의 인스턴스를 찾은 후 그 인스턴스에서 공개 서브를 실행하는 방법은 무엇입니까?

예를 들어 인벤토리 패키지에서 체크 아웃 양식이 열려 있고 Checkout.AddID (ID를 정수로 사용)를 실행하는 부분을 체크 아웃 할 수있는 바로 가기가 있습니다. 예 :

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으로 변환 할 수 없습니다.'가 발생합니다.

엄격한 옵션을 끄지 않고이 작업을 수행하는 방법은 무엇입니까?

+0

DirectCast (Form, FRMCheckout) .AddIDToList (Ctype (PartID, Integer).) 사용자가 FRMCheckout의 두 인스턴스를 열었을 때 어떤 일이 일어날 지 생각해보십시오. 가능한 가장 마지막 순간에 알아낼 필요가없는 가장 좋은 방법은 생성자를 사용하여 FRMCheckout 클래스에 어떤 객체 –

답변

3

OfType enumerable extension를 들어, 코드는

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

이제 루프 반환 유형 FRMCheckout의 양식과 어떤 변환없이 공용 메서드와 속성을 호출 할 수 있도록 반복자 변수가 이미 강력한 형식이다. 물론 모든 불평 작업은 OfType 확장자 내에서 이루어 지므로 예상되는 경우 성능이 실제로 향상되지는 않지만 코드 조각을 작성하고 이해하는 명확한 방법이 있습니다.

+0

5 줄을 찍은 것과 똑같은 일을 할 때, 이제는 1 분이 걸립니다. 감사합니다. (편집 : 링크 주셔서 감사합니다) – Josh

+0

네,이 확장 기능은 정말 깔끔하고 아마도 가장 많이 사용되는 기능 중 하나입니다. 양식에서 컨트롤 세트를 찾는 것이 매우 효과적입니다 (예 : _Form.Controls.OfType (Of TextBox) _) – Steve

2

그래서 나는 다음이 솔루션을 발견하고, 내 의견에 약간의 깔끔한 보이는 (우리는 당신이 명백한 당신이해서 downvote하기 전에 배우려고 노력하고 있기 때문에 우리에게 기억하십시오) :

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 

이것은 작동합니다.