如何使用 TextBox 事件已更改,以便在 vb.net 中输入时不会始终出现消息框。
实际上,如果我的文本框与数据库不匹配,我会使用文本框更改事件,然后会出现一个消息框,以确定我的代码是否有问题。请指导我。
谢谢
Private connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\demo.accdb;Persist Security Info=False;"
Private Sub Form7_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim acsCustomers As AutoCompleteStringCollection = New AutoCompleteStringCollection()
For Each dr As DataRow In Me.GetData().Rows
acsCustomers.Add(dr("CODEPRODUCT").ToString())
Next
TextBox1.AutoCompleteMode = AutoCompleteMode.Suggest
TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
TextBox1.AutoCompleteCustomSource = acsCustomers
End Sub
Private Function GetData() As DataTable
Dim conString As String = connectionString
Dim query As String = "select CODEPRODUCT from Items"
Using con As OleDbConnection = New OleDbConnection(conString)
Using cmd As OleDbCommand = New OleDbCommand(query, con)
Using sda As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Using dt As DataTable = New DataTable()
sda.Fill(dt)
Return dt
End Using
End Using
End Using
End Using
End Function
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim rows As DataRow() = Me.GetData().Select("CODEPRODUCT='" & TextBox1.Text.Trim() & "'")
If rows.Length = 0 Then
MessageBox.Show("Please Select From List Only")
End If
End Sub
这里有几点需要考虑。
首先,
GetData()
函数返回一个已释放的对象,因为您正在使用Using
语句来创建它。返回已处理的对象,准备好收集和销毁有什么意义?
你应该改为:
Private Function GetData() As DataTable
Dim conString As String = connectionString
Dim query As String = "SELECT CODEPRODUCT FROM Items"
Dim dt As New DataTable()
Using con As OleDbConnection = New OleDbConnection(conString),
cmd As OleDbCommand = New OleDbCommand(query, con),
sda As OleDbDataAdapter = New OleDbDataAdapter(cmd)
sda.Fill(dt)
End Using
dt.AcceptChanges()
Return dt
End Function
其次,您不应该在文本更改时进行验证并执行过多的数据库查询。获取整个输入并验证它。说到数据库。仔细查看您的代码,您会发现您不再需要访问它来验证产品代码。您已将它们全部填写在
TextBox.AutoCompleteCustomSource
集合中,您可以使用它作为产品源。
例如,在
Validating
事件中:
Private Sub Form7_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim acsCustomers As New AutoCompleteStringCollection
Using dt As DataTable = GetData()
acsCustomers.AddRange(
dt.AsEnumerable().
Select(Function(r) r.Field(Of String)("CODEPRODUCT")).ToArray())
End Using
TextBox1.AutoCompleteMode = AutoCompleteMode.Suggest
TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
TextBox1.AutoCompleteCustomSource = acsCustomers
End Sub
Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
Dim product = TextBox1.Text.Trim()
Dim products = TextBox1.AutoCompleteCustomSource.Cast(Of String)
If product.Length > 0 AndAlso products.Any() AndAlso
Not products.Contains(product, StringComparer.OrdinalIgnoreCase) Then
MessageBox.Show("Please Select From List Only...")
e.Cancel = True
TextBox1.SelectAll()
' Or
' TextBox1.Clear()
End If
End Sub
如果用户应该选择某些内容,请删除
product.Length > 0
条件。此外,您可以通过调用 Form.ValidateChildren
方法强制验证按命令键。
Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Enter Then
Me.ValidateChildren()
End If
End Sub
旁注,无需执行数据库
SELECT
查询并填充 DataTable
对象来仅检查产品是否存在。改为运行 COUNT
查询。