2016-07-09 2 views
1

Просто быстро, я пытаюсь очистить свои методы кодирования и наткнулся на это, я не мог решить.Запуск вспомогательного устройства на форме с опцией Strict ON

С опцией strict on, как вы находите экземпляр формы и запускаете публичный элемент в указанном экземпляре?

Например, в пакете инвентаря у меня есть ярлык для проверки части, которая обнаруживает, что форма проверки открыта и запускает Checkout.AddID (ID как целое). EG:

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 будет выдавать «Невозможно набросить тип формы на FRMcheckout», когда цикл for попадает в обычную форму.

Что было бы для этого, не отключая опцию строгого режима?

(Пожалуйста, помните, мы спрашиваем, потому что мы пытаемся узнать, прежде чем downvote это только потому, что его очевидным для вас)

+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 и переменная-итератор уже сильно типизированных, так что вы могли бы назвать его публичные методы и свойства без какого-либо преобразования. Разумеется, вся работа grunt выполняется внутри расширения OfType, поэтому на самом деле это не улучшение производительности, если любой из них ожидается, а просто более понятный способ написать и понять кусок кода.

+0

Мне нравится, когда способ сделать то же самое, что взял 5 строк, теперь принимает 1 :) спасибо. (EDIT: Спасибо за ссылку) – Josh

+0

Да, это расширение действительно опрятное и, вероятно, одно из самых используемых. Он отлично работает и для поиска набора элементов управления в вашей форме (например, _Form.Controls.OfType (Of TextBox) _) – Steve

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 

Это работает.