检索控件的text属性时获得的空值

时间:2014-04-10 15:56:25

标签: vb.net

我目前正在解决一个我似乎无法弄清楚的奇怪问题。我是一名新手程序员,目前正在使用VB.net通过GPIB接口自动化一些实验室设备。

我正在使用Excel来收集和制表我的数据。所以我的问题的核心是我正在使用Backgroundworker来执行从各种实验室设备中获取的数据的“保存”。很多时候,我将不得不记录我正在测试的样品的装配数据。在这里,我创建了另一个带有相关字段的表单,以填写我想要记住的所有数据。

backgroundworker线程将进入辅助表单,我将其命名为DAq6.vb,并提取数据。但是,我一直注意到它返回“”而不是存在的实际字符串。

Public Function GetControlValue(ByVal ctl As Object) As String
    Dim text As String
    Try
        If ctl.InvokeRequired Then
            text = ctl.Invoke(New GetControlValueInvoker(AddressOf GetControlValue), ctl)
        Else
            If TypeName(ctl) = "ComboBox" Then
                text = ctl.Text
            ElseIf TypeName(ctl) = "NumericUpDown" Then
                text = ctl.value
            ElseIf TypeName(ctl) = "TextBox" Then
                text = ctl.Text
            ElseIf TypeName(ctl) = "RadioButton" Then
                text = ctl.Checked
            ElseIf TypeName(ctl) = "Decimal" Then
                text = ctl.Value
            ElseIf TypeName(ctl) = "Label" Then
                text = ctl.Text
            Else 
                text = "Type name unknown"
            End If
        End If
        Return text
    Catch ex As Exception
        MsgBox("Error: " & Err.Description)
    End Try
End Function

以上是我用来安全地从不同的线程中检索“控制值”的函数。

以下是我用来从我当前所处的形式(DAq1.vb)获取值的方法的代表。此代码有效,并且它成功检索字符串。

objRange = objSheet1.Range("B1")
objRange.Value = GetControlValue(txtDate)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objRange)

奇怪的是,代码不起作用。我很困惑,为什么它不起作用。

objRange = objSheet6.Range("G2")
objRange.Value = GetControlValue(DAq6.txtLotNum1)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objRange)

为什么会出现这种情况?同样,我是一名新手程序员,主要是VB.net语法中的自学成才,所以如果这会导致任何问题,我会道歉。但是我已经在互联网上挖了几天寻找问题了,我很难过。

非常感谢您阅读所有这些内容!

编辑:我根据Bjørn-Roger的建议调整了功能。在错误生成代码行之前插入断点后,我看到它正确地转到if语句的TypeName(ctl)=“TextBox”部分。然而,它仍然返回“”而不是正确的值。

1 个答案:

答案 0 :(得分:0)

确保您返回所有路径上的代码,并引用DAq6的正确实例。

这是一个简单的例子:

Public Class DAq1
    'Inherits Form

    Public Sub New()
        Me.InitializeComponent()
    End Sub

    Public Function GetControlValue(ByVal ctl As Control) As String
        If (ctl Is Nothing) Then
            Throw New ArgumentNullException("ctl")
        End If
        Try
            If (ctl.InvokeRequired) Then
                Return CStr(ctl.Invoke(New GetControlValueInvoker(AddressOf GetControlValue), ctl))
            Else
                If (TypeOf ctl Is NumericUpDown) Then
                    Return DirectCast(ctl, NumericUpDown).Value.ToString()
                ElseIf (TypeOf ctl Is RadioButton) Then
                    Return DirectCast(ctl, RadioButton).Checked.ToString()
                Else
                    'Fallback to Control.Text
                    Return ctl.Text
                End If
            End If
        Catch ex As Exception
            MessageBox.Show("Error: " & Err.Description)
        End Try
        Return Nothing
    End Function

    Private Sub _DoWork(s As Object, e As DoWorkEventArgs) Handles worker.DoWork
        Dim f As DAq6 = DirectCast(e.Argument, DAq6)
        e.Result = Me.GetControlValue(f.txtLotNum1)
    End Sub

    Private Sub _Completed(s As Object, e As RunWorkerCompletedEventArgs) Handles worker.RunWorkerCompleted
        If (e.Error Is Nothing) Then
            MessageBox.Show(CStr(e.Result), Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            MessageBox.Show(e.Error.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub

    Private Sub _Shown(s As Object, e As EventArgs) Handles Me.Shown
        Dim f As New DAq6()
        f.txtLotNum1.Text = "YES!"
        Me.worker.RunWorkerAsync(f)
    End Sub

    Private WithEvents worker As New BackgroundWorker
    Public Delegate Function GetControlValueInvoker(ctl As Control) As String

    Public Class DAq6
        Inherits Form
        Public ReadOnly txtLotNum1 As New TextBox
    End Class

End Class