通过datagridview搜索值

Use*_*r59 1 .net vb.net oledb datagridview

我试图通过在文本框中输入文本然后使用SQL查询数据库然后在datagridview中显示结果来搜索数据库中的特定值.

这是代码:

  Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
    Connection.Open()
    Dim dataTable As New DataTable
    Dim dataSet As New DataSet
    dataSet.Tables.Add(dataTable)
    Dim dataAdapter As New OleDbDataAdapter
    Dim SQLQuery As String
    SQLQuery = <sql> 
            SELECT * 
                 FROM Students
                 WHERE StudentFirstName = @StudentFirstName
                </sql> .Value

    dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
    dataAdapter.SelectCommand.Parameters.Add("@StudentFirstName", SqlDbType.Text).Value = txtStudentFirstname.Text
    dataAdapter.Fill(dataTable)
    dgrStudentDatabaseViewer.DataSource = dataTable.DefaultView
    ShowItems()
    Connection.Close()
End Sub
Run Code Online (Sandbox Code Playgroud)

对ShowItems()的调用刷新datagridview这里是它的代码

 Private Sub ShowItems() ' the following delcleration are used for displaying the contents of the table
    Dim dataAdapter As New OleDbDataAdapter
    Dim DataTable As New DataTable
    Dim DataSet As New DataSet
    Dim SQLQuery As String = <sql>SELECT * FROM Students</sql>
    DataSet.Tables.Add(DataTable)
    dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
    dataAdapter.Fill(DataTable) ' fills the content from the database into the table in vb net
    dgrStudentDatabaseViewer.DataSource = DataTable.DefaultView
    Connection.Close()
End Sub
Run Code Online (Sandbox Code Playgroud)

此刻,当我试图搜索没有任何事情发生时,datagridview的内容仍然保持原样.我知道它可能与我的SQL查询的XML文字有关,但无法弄清楚.

提前致谢.

Ňɏs*_*arp 7

您可以通过New一遍又一遍地创建数据库对象来实现自己的目标.如果DataAdapter是表单级变量,则必须编写更少的代码:

Public Class Form1
    ' declare some persistant DB objects
    Private myDT As DataTable
    Private myDA As OleDbDataAdapter
    Private myStudentsDataView As DataView

    Private dbConnStr As String = "(your connection string)"
Run Code Online (Sandbox Code Playgroud)

这些只是声明,没有它们的实例(不New).但是,在那里他们被宣布决定Scope.它们将一直存在,直到表单关闭(或者用Dim/和/或覆盖它们New).表格加载:

' initialize the objects
Dim sql = "SELECT A, B, C, D... FROM Students"

' this is the ONLY place you use NEW 
' with these objects
myDT = New DataTable()

' The Adapter can create its own Connection 
'     and SelectCommand
myDA = New OleDbDataAdapter(sql, dbConnStr)

Dim myCB As New OleDbCommandBuilder(da)

' "teach" the DA how to Update and Add:
myDA.UpdateCommand = myCB.GetUpdateCommand
myDA.InsertCommand = myCB.GetInsertCommand
myDA.DeleteCommand = myCB.GetDeleteCommand

myDA.Fill(myDT)
myDA.FillSchema(myDT, SchemaType.Source)

myStudentsDataView = myDT.DefaultView
dgvStudents.DataSource = myStudentsDataView
Run Code Online (Sandbox Code Playgroud)

DataAdapter需要一个连接对象的工作,但作为注解中提到的,而不是明确创建一个,该适配器可以创建自己的.它会根据需要打开和关闭它.对于SelectCommand它来说也是如此- 它将从传递的SELECT SQL语句中创建自己的.

请注意,最好按照希望列显示的顺序指定每列DataTable.重要的是,在最后的是 DataAdapter知道如何删除,插入和更新的行.只要您不破坏它或替换它,您就不必编写任何SQL来添加或更改行!

在大多数情况下,DataTable它用作DataSourceDGV:

myDGV.DataSource = myDT 
Run Code Online (Sandbox Code Playgroud)

DGV将创建所需的列并将数据显示为行.当用户键入单元格时,这些更改会反映在单元格中,DataTable因此不需要任何代码将其删除.

在用户编辑数据的情况下,DataGridView您只需将更改发送回DB:

myDa.Update(myDT)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,根据以前的问题,数据来自文本控件而不是DGV.所以:

Private Sub AddStudent()
    ' no need to (RE)create DataAdapter

    ' add the data to a new row:
    Dim dr = myDT.NewRow
    dr.Item("FirstName") = textbox1.text
    dr.Item("LastName") = textbox2.text
    ' etc etc

    ' add the new row to the datatable
    myDT.Rows.Add(dr)
   ' with a persistent DA, this is all you need to add a row:
   myDA.Update(myDT)
End Sub
Run Code Online (Sandbox Code Playgroud)

我们"教"了DataAdapter如何在表单加载中更新行,因此实际更新数据库(一旦数据在DT中)就是一行代码:myDA.Update(myDT).

DataTable曲目各行是否是新的,更改或删除连,所以 myDA.Update(myDT)需要为每一个相应的操作.如果系统是多用户,您可以选择其他用户的更改:

myDa.Fill(myDT)
Run Code Online (Sandbox Code Playgroud)

搜索也很简单:

Private Sub Search(txt As String)
    myStudentsDataView.RowFilter = String.Format("LastName = '{0}'", txt)
Run Code Online (Sandbox Code Playgroud)

要删除过滤器:

myStudentsDataView = myDT.DefaultView
Run Code Online (Sandbox Code Playgroud)

如果/当您DataAdapter无法添加,插入,更新或删除它意味着您在New某处创建了一个.不要这样做.同样,myDataViewmyDT您创建新的DT或DV或更改之前,将显示所有内容RowFilter.