我目前正在解决一个我似乎无法弄清楚的奇怪问题。我是一名新手程序员,目前正在使用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”部分。然而,它仍然返回“”而不是正确的值。
答案 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