通过datagridviewsearch值

我尝试通过在文本框中input文本,然后使用SQL查询数据库,然后在datagridview中显示结果来search数据库中的特定值。

这里是代码:

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 

对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 

此刻,当我试图search什么也没有发生,datagridview的内容保持原样。 我减less它可能与我的SQL查询的XML文字有关,但无法弄清楚。

提前致谢。

您可以通过反复创buildNew数据库对象以自己的方式进行操作。 如果DataAdapter是一个表单级别的variables,那么您将不得不编写更less的代码:

 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)" 

这些只是宣布,没有他们的实例(没有New )。 但是他们在哪里宣布决定了Scope 。 直到表单closures(或者用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 

DataAdapter需要一个连接对象才能工作,但是当注释提到而不是显式创build连接对象时,Adapter可以创build自己的连接对象。 它会根据需要打开和closures它。 SelectCommand同样如此 – 它将通过传递的SELECT SQL语句创build它自己的。

请注意,最好按照希望列显示在DataTable中的顺序指定每个列。 重要的是DataAdapter知道如何删除,插入和更新行。 只要你不摧毁或取代它,你不必写任何SQL来添加或更改行!

在大多数情况下, DataTable被用作DGV的DataSource

 myDGV.DataSource = myDT 

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

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

 myDa.Update(myDT) 

在这种情况下 ,根据以前的问题,数据来源于文本控件而不是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 

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

DataTable跟踪每一行是新的,更改还是删除,所以myDA.Update(myDT)为每个行采取适当的操作。 如果系统是多用户的,您可以select其他用户的更改:

 myDa.Fill(myDT) 

search也很简单:

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

要删除filter:

 myStudentsDataView = myDT.DefaultView 

如果/当你的DataAdapter添加,插入,更新或删除失败意味着你创build了一个New地方。 不要这样做。 同样, myDataView将显示任何在myDT直到您创build一个新的DT或DV或更改RowFilter