我目前正在处理用VB编码的应用程序。我正在修改并添加功能。
我遇到的问题是,在尝试选择值之前,我想根据值是否存在来运行ComboBox的验证检查。
组合框是从带有字典数据源的SQL查询填充的
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"
我从另一个ComboBox中选择一个值,该值填充了不同的SQL Query / SQL表。
当我选择第二个ComboBox值时,它来自的表包含第一个ComboBox的ID。我想在选择它之前验证第一个ComboBox中的值是否存在。
以下不起作用:
If cmbTechnician.Items.Contains(varSQLReader("Tech_ID").ToString) Then
cmbTechnician.SelectedValue = varSQLReader("Tech_ID").ToString
End If
VB中有没有一种特定的方法可以让它工作而不会过于复杂?另一项工作是制作更复杂的SQL查询,但如果有更简单的方法,我宁愿不这样做。
答案 0 :(得分:2)
由于您在字典上使用BindingSource
,因此应使用DataSource
来确定存在的事物。如果您尝试添加到cmbTimer.Items
或直接从中删除,则会收到错误消息,告知您使用DataSource
。所以做同样的事情来检查是否存在某些东西(不要使用具有本地范围的字典):
' 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
评论中的建议建议将DataSource
BindingSource
转回字典:
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
保留对字典的引用更容易,更直接,但重新创建它将起作用。
答案 1 :(得分:0)
这是另一种方式=>
If cmbTechnician.FindString(varSQLReader("Tech_ID").ToString) <= -1 Then
'Do Not Exist
End If
这将找到显示成员,如果存在值则返回行的索引,否则返回-1。
此处有更多信息=&gt; ComboBox.FindString