2017-01-30 2 views
2

Je suis nouveau à VB et je suis en cours de migration d'une application VB6 je n'ai pas écrire à .net et je me bats avec cette erreur,Comment accéder à cette variable?

If TypeOf Application.OpenForms.Item(i) Is frmAddChangeDelete Then 
      'UPGRADE_ISSUE: Control ctrlAddChangeDelete1 could not be resolved because it was within the generic namespace Form. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="084D22AD-ECB1-400F-B4C7-418ECEC5E36E"' 

      If **Application.OpenForms.Item(i).ctrlAddChangeDelete1.ParentFormNumber = intFormNumber** Then 

       If Application.OpenForms.Item(i).Text = "Add Proofed Expense Items" Then 
        boolAddProofed = True 
        Exit For 

ctrlAddChangeDelete1 appelle soi-disant la classe ami ctrlAddChangeDelete d'un fichier séparé VB, donc je ne sais pas pourquoi il est dit que

"'ctrlAddChangeDelete1' is not a member of 'System.Windows.Forms.Form'."

Toute aide est appréciée, je vous remercie!

Répondre

2

Application.OpenForms est une collection non fortement typée.
Lorsque vous référencez des éléments, vous récupérez un formulaire générique.
Dans une forme générique, il n'y a aucun contrôle nommé ctrlAddChangeDelete1

Si vous avez une forme classe dérivée nommée frmAddChangeDelete et cette classe a un contrôle nommé ctrlAddChangeDelete1 alors vous devez jeter la référence stockée dans les OpenForms collection à votre classe de formulaire spécifique avant d'essayer de référencer ce contrôle.

De plus, pour accéder à ce contrôle à partir d'un code externe, vous devez également définir la propriété Modifiers sur Public à la place de l'interne par défaut. Sinon, vous ne pourrez accéder au contrôle à partir d'aucun code externe à la classe.

Pour récupérer correctement votre formulaire, vous pouvez écrire

Dim delForm = Application.OpenForms. 
         OfType(Of frmAddChangeDelete) 
         FirstOrDefault() 
If delForm Is Nothing Then 
    ' No form of type frmAddChangeDelete is present in the collection 
    ' write here your message and exit ? 
Else 
    ' Now you can use delForm without searching again in the collection 
    ...... 

Le code ci-dessus utilise l'extension IEnumerable.OfType et cela nécessite l'Imports System.Linq.
Si vous ne souhaitez pas utiliser cela, alors vous pouvez toujours utiliser l'opérateur TryCast pour obtenir la référence à la classe correcte

' Still you need a for loop up ^^^^ before these lines 
Dim delForm = TryCast(Application.OpenForms(i), frmAddChangeDelete) 
if delForm Is Nothing then 
    .... 
else 
    .... 
+0

J'undestand l'erreur beaucoup mieux maintenant, je vous remercie! Bien que maintenant je me demande s'il y a un problème avec mes espaces de noms/références car apparemment, OfType n'existe pas dans OpenForms ... – Sam

+0

[IEnumerable.OfType] (https://msdn.microsoft.com/fr-fr/library Les extensions /bb360913(v=vs.110).aspx) requièrent l'espace de noms System.Linq (vous devriez déjà avoir la référence mais vous avez besoin de Imporst System.Linq) – Steve