Blank value obtained when retrieving the text property for a control
I'm currently working through a rather odd issue that I can't seem to figure out. I'm a novice programmer who is currently using VB.net to automate some lab equipment via the GPIB interface.
I'm using Excel to collect and tabulate my data. So the core of my problem is that I'm using a Backgroundworker to perform the "saving" of my data that I obtain from various lab equipment. Often times, I will have to record the assembly data of the specimens I'm testing. Here, I created another form with relevant fields to fill out all the data I'd ever desire to remember.
The backgroundworker thread will go into the secondary form, I've named it DAq6.vb, and pull the data. However, I've been noticing that it returns "" rather than the actual string that is present.
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
Above is the function that I use to safely retrieve a "control value" from a different thread.
And below is representative of the method I use to obtain values from the form I'm currently in (DAq1.vb). This code works, and it successfully retrieves the strings.
objRange = objSheet1.Range("B1") objRange.Value = GetControlValue(txtDate) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objRange)
Here is code that doesn't work, curiously. I'm baffled as to why it wouldn't work.
objRange = objSheet6.Range("G2") objRange.Value = GetControlValue(DAq6.txtLotNum1) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objRange)
Why would this be the case? Again, I'm a novice programmer that is primarily self-taught in VB.net syntax, so I apologize if this causes any cringing. But I have dug around the internet looking for an issue for a few days now, and I'm stumped.
Thank you so much for even just reading all of this!
Edit: I've adjusted the function according to Bjørn-Roger's suggestions. After inserting a breakpoint right before the error producing lines of code, I see that it correctly goes to the TypeName(ctl) = "TextBox" portion of the if statement. Yet, it still returns a "" rather than the correct value.
Ensure you return code on all paths and that you reference the correct instance of DAq6.
Here's a simple example:
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