2017-07-18 1 views
0

Comment pouvez-vous, dans VB.Net, évaluer la valeur des contrôles référencés dans une chaîne? Supposons que vous ayez une zone de texte N contenant un contenu alphanumérique et référencés dans une variable de chaîne comme ceci:Comment évaluer une chaîne contenant des références aux contrôles Windows Forms au moment de l'exécution?

Dim s As String = """Hello "" & N.Text & ""!""" 

Je voudrais être en mesure de réévaluer le contenu de la variable s ailleurs dans le code (où il y a aucune connaissance directe de l'existence de N), par exemple, comme ceci:

Dim e As String = Eval(s) 

Ceci est impossible avec VB.Net; aucune fonction Eval de ce type n'est disponible. J'ai vu des solutions presque plausibles en ligne telles que l'utilisation du vieux COM ScriptControl:

Private Shared _scriptControl As MSScriptControl.ScriptControl = New ScriptControl() 
_scriptControl.Language = "VBScript" 
Dim e As String = _scriptControl.Eval(s) 

Cependant, la référence à la propriété N.Text d'un contrôle Windows Forms est étranger à l'objet ScriptControl, et donc il jette une erreur.

Existe-t-il d'autres solutions rapides qui ne nécessitent pas l'achat d'un composant tiers?

+0

Avez-vous besoin de considérer une expression entière, ou êtes-vous simplement inquiet à propos de l'évaluation d'une chaîne identifiant une variable/un contrôle? Ce dernier devrait être assez simple à faire en utilisant la réflexion. – Craig

+0

Ressemble à une variable de chaîne ordinaire ordinaire. Résolvez le contenu dès le début, une fois – Plutonix

+0

Est-ce que ce doit être une chaîne? Sinon, un délégué à une expression lambda serait préférable, par ex. 'Dim s Comme Func (Of String) = Fonction()" Bonjour "& N.Text &"! "' –

Répondre

3

Cependant, la référence à la propriété N.Text d'un contrôle Windows Forms est étrangère à l'objet ScriptControl et par conséquent, il génère une erreur . ... J'ai seulement mentionné l'idée de ScriptControl pour repousser réponses qui pourraient impliquer cette approche que j'ai mentionné puisque je l'ai déjà essayé et que je ne veux pas perdre notre temps.

Vous pouvez ajouter la zone de texte au contrôle de script. Tout d'abord, obtenez une référence à "N" en utilisant son nom. Vous ne savez pas si vous avez déjà le nom du contrôle en lui-même; sinon, vous devrez peut-être analyser votre chaîne pour obtenir le nom. Ensuite, utilisez Controls.Find() pour obtenir une référence et passez-la à AddObject(). Maintenant, votre chaîne peut être évaluée comme prévu:

Private Shared _scriptControl As MSScriptControl.ScriptControl = New ScriptControl() 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    _scriptControl.Language = "VBScript" 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim ctlName As String = "N" 
    Dim ctl As Control = Me.Controls.Find(ctlName, True).FirstOrDefault 
    If Not IsNothing(ctl) Then 
     Try 
      _scriptControl.AddObject(ctlName, ctl) 
     Catch ex As Exception 
     End Try 

     Dim code As String = """Hello "" & N.Text & ""!""" 
     Dim result As String = _scriptControl.Eval(code) 
     MessageBox.Show(result) 
    End If 
End Sub 
+0

Eureka! Cette réponse m'a éclairé sur l'applicabilité de l'objet ScriptControl dans un projet Winforms. J'avais déjà rejeté cette approche - mais avec votre aide, je l'ai fait fonctionner! Merci beaucoup! – ShieldOfSalvation

1

String Interpolation a été introduit dans Visual Basic 14. Étant donné que le contrôle est déclaré comme une variable d'ami dans le concepteur du formulaire, on peut supposer que vous pouvez utiliser la référence au contrôle dans la chaîne comme ceci:

Dim s As String = $"Hello {N.Text}!" 
+0

J'ai mal compris la question.Ma seule autre pensée serait de créer une classe avec deux propriétés, une pour stocker la valeur du message et l'autre pour stocker la valeur alphanumérique. – David