Charles Rutherford
Charles Rutherford

Reputation: 27

VB.NET ComboBox Verify if Value Exists

I am currently working on an application that was coded in VB. I am making modifications and adding features to it.

The issue I have is that I want to run a verification check for the ComboBox based on if the value exists before I attempt to select it.

The combo box is populated from a sql query with a dictionary data source

Dim TimerComboSource As New Dictionary(Of String, String)()
TimerComboSource.Add(varSQLReader("ID").ToString, varSQLReader("Name").ToString)
'Binds the values to the comboboxes
cmbTimer.DataSource = New BindingSource(TimerComboSource, Nothing)
cmbTimer.DisplayMember = "Value"
cmbTimer.ValueMember = "Key"

I select a value from a different ComboBox which is populated with a different SQL Query/SQL Table.

When I select the second ComboBox value, the table it comes from contains the ID of the first ComboBox. I want to verify if the Value Exists in the first ComboBox before I select it.

The following does not work:

If cmbTechnician.Items.Contains(varSQLReader("Tech_ID").ToString) Then
    cmbTechnician.SelectedValue = varSQLReader("Tech_ID").ToString
End If

Is there a specific way in VB to make this work without it being overly complicated? The other work around would to make a more complicated SQL query but I rather not do that if there's a simpler way.

Upvotes: 0

Views: 15896

Answers (2)

lwin
lwin

Reputation: 4460

Here are another way =>

 If cmbTechnician.FindString(varSQLReader("Tech_ID").ToString) <= -1 Then
         'Do Not Exist 
 End If

This will find the display member and will return an index of the row if there exist value, otherwise will return -1.

More Info are here=>ComboBox.FindString

Upvotes: 0

user3697824
user3697824

Reputation: 536

Since you are using a BindingSource on a Dictionary, you should use the DataSource to determine of things exist. If you tried to add to cmbTimer.Items or delete from it directly, you'd get an error telling you to use the DataSource. So do the same for checking if something exists (dont use a dictionary with local scope):

' form or class level collection
Private cboSource As New Dictionary(Of String, String)

cboSource.Add("red", "red")
cboSource.Add("blue", "blue")
cboSource.Add("green", "green")

cbo.DataSource = New BindingSource(cboSource, Nothing)
cbo.DisplayMember = "Value"
cbo.ValueMember = "Key"

If cbo.Items.Contains("red") Then
    Console.Beep()     ' wont hit
End If

If cboSource.ContainsValue("red") Then
    Console.Beep()     ' hits!
End If

The suggestion in comments suggests casting the DataSource of the BindingSource back to dictionary:

Dim tempBS As BindingSource = CType(cbo.DataSource, BindingSource)
Dim newCol As Dictionary(Of String, String) = CType(tempBS.DataSource, Dictionary(Of String, String))

If newCol.ContainsValue("red") Then
    Console.Beep()     ' hits!
End If

It is easier and more direct to retain a reference to the dictionary, but recreating it will work.

Upvotes: 3

Related Questions