Categorieën >
VB.NET >
Zoekopdracht met timer en textbox
Onderwerp: Zoekopdracht met timer en textbox (Opgelost)
Door: SICKBOYYYYY
Op: 04/02/2010 14:06
Laatste wijziging: 05/02/2010 09:04
|
|
offline
|
Lid
|
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 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 TimerTick()
Timer1.Enabled = False
Timer1.Interval = 500
Timer1.Enabled = True
'zoek
End Sub
Private Sub TimerTick() Timer1.Enabled = False Timer1.Interval = 500 Timer1.Enabled = True 'zoek End Sub
Zou iemand mij kunnen verderhelpen?
|
Door: Mario
Op: 04/02/2010 15:05
|
|
offline
|
Moderator
|
Waarom niet met het change event van je textbox werken ?
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
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
|
Door: SICKBOYYYYY
Op: 04/02/2010 16:07
Laatste wijziging: 04/02/2010 16:17
|
|
offline
|
Lid
|
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!
|
Door: titjes
Op: 05/02/2010 00:01
Laatste wijziging: 05/02/2010 00:06
|
|
online
|

.NET Admin
|
Zorg dat in je FormLoad je DataGrid gevuld wordt aan de hand van een DataTable. Declareer je DataTable buiten je FormLoad event:
Dim originalTable As New DataTable("NaamDataTable")
Dim originalTable As New DataTable("NaamDataTable")
In het TextChanged event van je TextBox plaats je dan volgende code:
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
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.
|
Door: SICKBOYYYYY
Op: 05/02/2010 09:00
Laatste wijziging: 05/02/2010 09:03
|
|
offline
|
Lid
|
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?
Of vergis ik mij?
alvast bedankt
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
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
|
Door: titjes
Op: 05/02/2010 10:51
|
|
online
|

.NET Admin
|
Waarom zou dit niet kunnen? Anders geef eens wat code.. ;) Nu is het gokken naar hoe het eruit ziet..
|
Door: SICKBOYYYYY
Op: 05/02/2010 13:56
Laatste wijziging: 05/02/2010 14:38
|
|
offline
|
Lid
|
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
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
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!
alvast bedankt!
|
Door: titjes
Op: 05/02/2010 17:22
|
|
online
|

.NET Admin
|
Zo dan he:
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 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
|
Door: SICKBOYYYYY
Op: 08/02/2010 08:53
Laatste wijziging: 08/02/2010 16:55
|
|
offline
|
Lid
|
Heb er zelf iets op gevonden:
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
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
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.
UPDATE*
strHoogsteID = "SELECT PCB_ID FROM PCB ORDER BY PCB_ID DESC LIMIT 0,1"
strSQL = "UPDATE PCB SET PCB_FILTER='" & txtbedrijfsnaam.Text & txtmerk.Text & txttype.Text & txtserienummer.Text & txtos.Text & txtgebruiker.Text & txtgelabeld.Text & txtvernietigd.Text & "' WHERE PCB_ID ='" & strHoogsteID & "';"
OleDbCommand.CommandText = strSQL
OleDbCommand.ExecuteNonQuery()
strHoogsteID = "SELECT PCB_ID FROM PCB ORDER BY PCB_ID DESC LIMIT 0,1" strSQL = "UPDATE PCB SET PCB_FILTER='" & txtbedrijfsnaam.Text & txtmerk.Text & txttype.Text & txtserienummer.Text & txtos.Text & txtgebruiker.Text & txtgelabeld.Text & txtvernietigd.Text & "' WHERE PCB_ID ='" & strHoogsteID & "';" OleDbCommand.CommandText = strSQL OleDbCommand.ExecuteNonQuery()
Data Type Mismatch = ERROR
|
Door: titjes
Op: 08/02/2010 22:17
|
|
online
|

.NET Admin
|
Is PCB_ID van het type integer? Want in je update-query staat de variabele als een string. En die ';' mag ook weg:
strSQL = "UPDATE PCB SET PCB_FILTER='" & txtbedrijfsnaam.Text & txtmerk.Text & txttype.Text & txtserienummer.Text & txtos.Text & txtgebruiker.Text & txtgelabeld.Text & txtvernietigd.Text & "' WHERE PCB_ID = " & strHoogsteID
strSQL = "UPDATE PCB SET PCB_FILTER='" & txtbedrijfsnaam.Text & txtmerk.Text & txttype.Text & txtserienummer.Text & txtos.Text & txtgebruiker.Text & txtgelabeld.Text & txtvernietigd.Text & "' WHERE PCB_ID = " & strHoogsteID
|
|
|
|
offline
|
Lid
|
Ok titjes, het werkt, alsvast bedankt!
grtz
|
Je moet ingelogd zijn om een reactie te kunnen posten...
|
|
|