Ik ben al een paar uur aan het zoeken op dit De bedoeling is dat ik in mijn zoektextbox tekst zal invoeren, met behulp van een timer heb ik een interval van 500ms tussen de ingevoerde gegevens en de zoekopdracht in de datagrid.
Wanneer ik mijn tekst invoer in mijn tekstbox, verkleurd de achtergrond van mijn tekst box rood (hij is aan het zoeken in de datagrid naar de gezochte termen), de tekstbox kleurt terug wit als de zoekopdracht gedaan is en de datagrid alle 'info' vindt met de waarde die ik opzocht
Voor de timer heb ik al iets geprobeerd, maar niets blijkt te werken:
Private sub Timer1_Timer()
Timer1.Enabled = txtzoeken.TextLength > 0
If Timer1.Enabled = True Then
txtzoeken.BackColor = Color.Red
Else
txtzoeken.BackColor = Color.White
End If
End Sub
Private Sub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtzoeken.TextChanged
If txtzoeken.TextLength > 0 Then txtzoeken.BackColor = Color.Red Else txtzoeken.BackColor = Color.White
End Sub
PrivateSub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles txtzoeken.TextChanged
If txtzoeken.TextLength > 0Then txtzoeken.BackColor= Color.RedElse txtzoeken.BackColor= Color.White
Hey, zover zit ik ondertussen ook, maar hoe kan ik nu via deze tekstbox heel mijn datagridview gaan filteren, dus als ik bv 'Th' invoer, filter hij heel de datagrid en laat hij alleen de records tonen waarin 'Th' invoorkomt?
Programming in VB.NET 2008 wel te verstaan*, ik ben echt teneinde raad betreffende dit, dit lijkt echt zoiets dat veelzijdig gebruikt wordt, maar vind echt nergens de juiste informatie!
Alvast bedankt!
Abbas - 05/02/2010 00:01 (laatste wijziging 05/02/2010 00:06)
Crew .NET
Zorg dat in je FormLoad je DataGrid gevuld wordt aan de hand van een DataTable. Declareer je DataTable buiten je FormLoad event:
If String.IsNullOrEmpty(txtZoekvak.Text) Then
uwDataGrid.DataSource = originalTable
Else
Dim filterView As New DataView(originalTable)
filterView.RowFilter = "Kolomnaam = '" & txtZoekvak.Text & "' "
uwDataGrid.DataSource = filterView
End If
In je FormLoad event moet je dan enkel de code nog voorzien om je DataTable (originalTable) te vullen met gegevens en dan ook de DataSource van je DataGrid in te stellen op die DataTable.
Het probleem is, dat het programma reeds zeer uitgebreid is en dat ik mijn form_load event al bij andere functies heb toegepast. Ik kan met andere woorden mijn DataSource van mijn Datagrid niet meer instellen op mijn DataTable?
Private Sub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtzoeken.TextChanged
Dim originalTable As New DataTable("originalTable")
If txtzoeken.TextLength > 0 Then txtzoeken.BackColor = Color.Red Else txtzoeken.BackColor = Color.White
If String.IsNullOrEmpty(txtzoeken.Text) Then
DataGridView1.DataSource = originalTable
Else
Dim filterView As New DataView(originalTable)
filterView.RowFilter = "Kolomnaam = '" & txtzoeken.Text & "'"
DataGridView1.DataSource = filterView
End If
End Sub
PrivateSub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles txtzoeken.TextChanged
Dim originalTable AsNew DataTable("originalTable")
If txtzoeken.TextLength > 0Then txtzoeken.BackColor= Color.RedElse txtzoeken.BackColor= Color.White
In de volgende code kun je zien hoe ik mijn database aanspreek om mijn datagrid te vullen met de nodige informatie + hoe ik mijn datagrid ga aanspreken:
Public Sub Vul_Datagrid()
OleDbConnection.Open()
Dim odr_PCB As OleDb.OleDbDataReader
OleDbCommand.CommandText = strSQL
odr_PCB = OleDbCommand.ExecuteReader()
Dim dt As New System.Data.DataTable
dt.Load(odr_PCB)
DataGridView1.DataSource = dt
odr_PCB.Close()
OleDbConnection.Close()
End Sub
Private Sub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtzoeken.TextChanged
Dim strzoeken As String
strzoeken = CStr(txtzoeken.Text)
DataGridView1.DataSource = ds
Dim filterView As New DataView
filterView.RowFilter = "PCB_ID <> '" & strzoeken & "'"
DataGridView1.DataSource = filterView
Vul_Datagrid()
End Sub
PublicSub Vul_Datagrid()
OleDbConnection.Open()
Dim odr_PCB As OleDb.OleDbDataReader
OleDbCommand.CommandText= strSQL
odr_PCB = OleDbCommand.ExecuteReader()
Dim dt AsNew System.Data.DataTable
dt.Load(odr_PCB)
DataGridView1.DataSource= dt
odr_PCB.Close()
OleDbConnection.Close()
EndSub
PrivateSub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles txtzoeken.TextChanged
textzoeken_TextChanged --> heb voorlopig die RowFilter op PCB_ID staan, maar hij zou moeten gaan zoeken in heel mijn datagrid in elk veld maw, en alleen diegene tonen waar mijn 'strzoeken' instaat. Ik maak dus ook gebruik van een dataset, maar kon je al afleiden uit de coding!
Dim originalTable As New DataTable()
Dim strSQL = "SELECT ..."
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Doe vanalles
VulDataGrid()
DataGridView1.DataSource = originalTable
End Sub
Private Sub VulDataGrid()
OleDbConnection.Open()
Dim odr_PCB As OleDb.OleDbDataReader
OleDbCommand.CommandText = strSQL
odr_PCB = OleDbCommand.ExecuteReader()
originalTable.Load(odr_PCB)
odr_PCB.Close()
OleDbConnection.Close()
End Sub
Private Sub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtzoeken.TextChanged
If String.IsNullOrEmpty(txtzoeken.Text) Then
DataGridView1.DataSource = originalTable
Else
Dim filterView As New DataView(originalTable)
filterView.RowFilter = "PCB_ID <> '" & txtzoeken.Text & "' "
DataGridView1.DataSource = filterView
End If
End Sub
Dim originalTable AsNew DataTable()
Dim strSQL ="SELECT ..."
PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)HandlesMyBase.Load
'Doe vanalles
VulDataGrid()
DataGridView1.DataSource= originalTable
EndSub
PrivateSub VulDataGrid()
OleDbConnection.Open()
Dim odr_PCB As OleDb.OleDbDataReader
OleDbCommand.CommandText= strSQL
odr_PCB = OleDbCommand.ExecuteReader()
originalTable.Load(odr_PCB)
odr_PCB.Close()
OleDbConnection.Close()
EndSub
PrivateSub txtzoeken_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles txtzoeken.TextChanged
Private Sub txtfilter_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtfilter.TextChanged
strSQL = "SELECT * FROM PCB WHERE PCB_Bedrijf like '%" & txtfilter.Text & "%'"
Vul_Datagrid()
End Sub
PrivateSub txtfilter_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles txtfilter.TextChanged
strSQL ="SELECT * FROM PCB WHERE PCB_Bedrijf like '%"& txtfilter.Text&"%'"
Vul_Datagrid()
EndSub
Op deze manier gaat hij wel eenvoudig filteren en op de juiste manier, maar nu zit ik met het volgende probleem! In dit geval filter ik alleen op PCB_Bedrijf --> nu wil ik eigenlijk gaan filteren over heel mijn datagrid! Dus bedacht ik het volgende:
Als ik nu de inhoud van al mijn kolommen op de een of andere manier in 1 bijgevoegde kolom kan krijgen (die ik dan niet laat zien in mijn datagrid. Dan kan ik wel over heel het veld gaan filteren en dan toont hij alleen die records waar hij positive match heeft gevonden?
Voorbeeld:
ik heb in de kolommen A, B, C, D allemaal waarden staan die ik wil samenvoegen in kolom E, er wordt niet opgeteld. In E moet komen te staan ACDB.
--> In A staat een 1, in B een 6, in C een 7 en in D een 8. In E moet dus 1786 (ACDB) komen te staan.