![]() |
|
![]() |
#1 |
![]() Neuer Benutzer |
![]() Liebe VB-Gemeinde,
da ich hier neu bin und „Fremde“ im Internet wie aufm Dorf komisch beliebäugelt werden, stelle ich mich mal kurz vor. Ich bin mittleren Alters, Immobilienverwalter und hatte vor vielen Jahren mal einen bisschen mehr als ein Grundkurs in VB. Nun möchte ich für die Arbeit ein Programm basteln, das mir erst mal folgendes erledigen soll: Wie schon im Betreff zu lesen, geht es mal wieder um eine DataGridview mit einer filternden Textbox: - Einlesen einer Excel-Tabelle in ein DataGridview – das habe ich soweit auch schon hinbekommen - Anzeigen der Tabelle und Autoresize –geht auch - Filterung der Tabelle mit bis zu zwei Textboxen oder irgendwas, womit es geht - Filterung nach zuerst nach Namen, wenn das nicht reicht anschließend - Filterung nach Vertragsnummer und wenn das auch nicht reicht noch Am Ende sollte bestenfalls nur noch ein Eintrag aus der Tabelle zu sehen sein um die Kreditorennummer abzulesen. An der Filterung scheitere ich leider. Ich habe schon einiges an Seiten gelesen und alles Mögliche versucht. Daraus kamen z.B. folgende Fehlermeldungen (die erste ist mit dem angefügten Code): - Syntaxfehler: Fehlender Operand nach dem Operator ''7%''. - Die Operation 'Like' kann nicht an System.Double und System.String durchgeführt werden. Versuche ich da zwei Dinge zu verbinden, die man nicht verbinden kann? Ich habs auch schon mit bindingsource versucht, aber das krieg ich irgendwie auch nicht hin. Ich bräuchte mal einen genaueren Tipp, nicht mal die Lösung. Meine VB-Kenntnisse sind alt und löchrig… Wenn das gelöst ist, poste ich auch gerne den Code nochmal für nachfolgende Generationen. Wobei das nur ein Zwischenziel ist. Glaube aber, dass ich danach alleine weiter komme. Im Übrigen überflüssige Dim's ingnorieren. Die sind aus gescheiterten Versuchen noch übrig. Ich schreibs zur Übung nochmal neu, wenn ich weiß, wie es geht. Code: Public Class Form1 WithEvents bsData As New BindingSource Dim DtSet As System.Data.DataTable Dim dt As New DataTable Dim dv As New DataView Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim MyConnection As System.Data.OleDb.OleDbConnection Dim MyCommand As System.Data.OleDb.OleDbDataAdapter MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ace.OLEDB.12.0;Data Source='d:gfzuzu.xls';Extended Properties=Excel 12.0;") MyCommand = New System.Data.OleDb.OleDbDataAdapter("select [Konto], [Beschriftung], [Straße], [Vertragsnummer] from [Sheet1$]", MyConnection) MyCommand.TableMappings.Add("Table", "TestTable") DtSet = New System.Data.DataTable MyCommand.Fill(DtSet) dt = DtSet DataGridView1.DataSource = DtSet DataGridView1.AutoResizeColumns() MyConnection.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Dim dv_kunde As New DataView Dim bs = New BindingSource Dim s As String dv = New DataView(DtSet) s = TextBox1.Text dv_kunde = New DataView(DtSet) dv_kunde.RowFilter = "Konto '" & TextBox1.Text & "%'" DataGridView1.DataSource = dv End Sub End Class |
![]() |
![]() ![]() |
![]() |
#2 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Hm... keinen einzigen lausigen Tipp? :--(
Ich hab mir wirklich zig Videos angeguckt, zig Codes ausm Netz gelesen und versucht richtig zu interpretieren, MSDN-Seiten angeguckt... ich komme einfach nicht drauf. Möchte damit nur sagen, dass ich mir nur ungern mangelnde Einsatzfreude vorwerfen lassen möchte. Ich verzweifel langsam... |
![]() |
![]() ![]() |
![]() |
#3 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Na gut... der Thread mutiert zwar langsam zur Alleinunterhaltung, aber ich gebe die Hoffnung nicht auf. Denn die stirbt bekanntlich zuletzt.
Ich habe nun einen anderen Ansatz probiert und bin damit nun auch schon weiter. Ich hab es hinbekommen, dass meine Tabelle erscheint und diese per Textbox gefiltert wird. Nun ist mein nächstes Problem, dass ich nach zwei Werten filtern muss. Es funktioniert, wenn ich 1x nach Straßen und 1x nach Nummern filter. Ich würd aber gerne beides zusammen machen. Könnt ihr mit dazu einen Tipp geben, wie ich den folgenden Code zusammenstelle, damit ich erst nach dem einen Wert und mit der übrigen Tabelle nach dem zweiten Wert suchen kann? Code: Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Me.Sheet1BindingSource.Filter = "Straße LIKE '" & TextBox1.Text & "%'" End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged Me.BindingSource2.Filter = "Vertragsnummer LIKE '" & TextBox2.Text & "%'" Geändert von bettwurst (09.11.2017 um 21:16 Uhr). |
![]() |
![]() ![]() |
![]() |
#4 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Sooo. Meine Anfrage hat sich wohl erledigt.
Mal abgesehen von der kombinierten Zwei-Textboxen-Suche, die ich nicht zwingend benötige, ist mein Programm vorerst fertig. Aber wie das geht finde ich irgendwann bestimmt noch raus. Weitere Funktionen kommen noch, aber die basieren auf dem Wissen, was bereits vorhanden ist. War 'ne schöne Zeit mit euch! ![]() Geändert von bettwurst (11.11.2017 um 18:29 Uhr). |
![]() |
![]() ![]() |
![]() |
#5 |
![]() Neuer Benutzer |
![]() Hallo,
ich würde das an deiner Stelle direkt oben im OleDbcommand filtern. Wenn in den Textboxen nichts steht, werden dann alle Datensätze angezeigt. Dafür würde ich das Laden der Daten in einer separaten Routine unterbringen: Code: Imports System.Data.OleDB Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load DatenLaden() End Sub Private Sub Text_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Textbox1.TextChanged, Textbox2.TextChanged DatenLaden() End Sub Privat Sub DatenLaden Dim MyConnection As OleDbConnection Dim MyCommand As OleDbDataAdapter MyConnection = New SOleDbConnection("provider=Microsoft.ace.OLEDB.12.0;Data Source='d:gfzuzu.xls';Extended Properties=Excel 12.0;") MyCommand = New OleDbDataAdapter("select [Konto], [Beschriftung], [Straße], [Vertragsnummer] from [Sheet1$] where Straße Like '" & _ Textbox1.text & "%' Vertragsnummer Like '%" & Textbox2.text & "%'", MyConnection) Dim da new OleDbDataAdapter(MyCommand) Dim dt as new DataTable da.Fill(dt) DataGridView1.DataSource = dt End Sub End Class Gruß Ralf |
![]() |
![]() ![]() |
![]() |
#6 |
![]() MOF Koryphäe |
![]() wenn Du einen SQL Server als DBMS dahinter hast schreib ne SQL proc und mach die zur Datenquelle. Geht auch prima mit Parametern. Für alles andere fällt mir auch nichts ein, da ich mich schon vor Jahren von ACCESS und Co. getrennt habe....
__________________ MarkBVom Leben nichts zu erwarten, ist das Geheimnis aller echten Heiterkeit! ![]() |
![]() |
![]() ![]() |