如何在运行时评估包含对Windows窗体控件的引用的字符串?

时间:2017-07-18 17:55:40

标签: vb.net winforms eval

你怎么能在VB.Net中评估字符串中引用的控件的值?假设您有一个包含一些字母数字内容的文本框N,并且它在字符串变量中引用,如下所示:

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

我希望能够在代码中的其他地方重新评估s变量的内容(其中没有直接知道N的存在),例如,像这样:

Dim e As String = Eval(s)

VB.Net无法做到这一点;没有这样的Eval功能。我在网上看到了一些几乎看似合理的解决方案,比如使用旧的COM ScriptControl:

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

但是,对Windows窗体控件的N.Text属性的引用与ScriptControl对象不同,因此会引发错误。

是否有其他快速解决方案不需要购买第三方组件?

2 个答案:

答案 0 :(得分:3)

  

但是,对Windows窗体的N.Text属性的引用   控件与ScriptControl对象不同,因此它会抛出   一个错误。 ......我只提到了ScriptControl想要抵挡的想法   答案可能涉及我已经提到的那种方法   尝试过,不想浪费我们的时间。

您可以将TextBox添加到脚本控件。首先,使用它的名称获取对“N”的引用。不确定你是否已经拥有控件的名称;如果没有,您可能需要解析您的字符串以获取名称。然后使用Controls.Find()获取引用并将其传递给AddObject()。现在您的字符串可以按预期进行评估:

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

答案 1 :(得分:1)

在Visual Basic 14中引入了

String Interpolation。由于控件在Form的设计器中被声明为Friend变量,因此可能您可以在String中使用对该控件的引用,如下所示: / p>

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