2017-07-18 62 views
0

你怎么能在VB.Net中评估字符串中引用的控件的值?假设你有一个包含一些字母数字内容的文本框N和它在一个字符串变量中引用这样的:如何在运行时评估包含对Windows窗体控件引用的字符串?

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对象,因此它抛出一个错误。

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

+0

您是否需要考虑整个表达式,还是只是担心评估标识变量/控件的字符串?后者使用反射应该相当简单。 – Craig

+0

听起来像一个普通的普通字符串变量。预先解决内容,一旦 – Plutonix

+0

它需要是一个字符串?如果不是的话,那么对lambda表达式的委托将是优选的,例如, 'Dim s As Func(Of String)= Function()“Hello”&N.Text&“!”' –

回答

3

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

您可以将文本框添加到脚本控件。首先,使用它的名称获得对“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 
+0

尤里卡!这个回答为我介绍了WinForms项目中ScriptControl对象的适用性。之前我已经解雇了这个方法 - 但在你的帮助下,我已经做到了!非常感谢你! – ShieldOfSalvation

1

String Interpolation是在Visual Basic 14推出,由于控制被声明为在窗体的设计师朋友变量,那么想必你可以在String这样使用参考控制:

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

我误解了这个问题。我唯一的想法是创建一个具有两个属性的类,一个用于存储消息的值,另一个用于存储字母数字值。 – David