如何使用 TextBox 事件已更改,以便在 vb.net 中输入时不会始终出现消息框

问题描述 投票:0回答:1

如何使用 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
vb.net winforms datatable binding textbox
1个回答
1
投票

这里有几点需要考虑。

首先,

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
查询。

© www.soinside.com 2019 - 2024. All rights reserved.