DataGrid durchsuchen ohne Datensätze verschwinden zu lassen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    DataGrid durchsuchen ohne Datensätze verschwinden zu lassen

    Servus Leute,

    ich habe die Aufgabe, dass ich ein DataGrid, die von einer MySql Datenbank gespeist wird, nach bestimmter weise Sortieren muss.
    klickt man in eine Zelle, so soll die bevorstehende Sortierung in der zugehörenden Spalte erfolgen.
    Gibt man nun text ein so soll in eben dieser Spalte nach dem Eintrag gesucht und Alphabetisch Sortiert werden.

    Ich dachte zunächst über eine SQL abfrage nach, doch soweit ich weis, kann man damit nur das Ergebnis einer Suche, also eine Teilmenge abrufen (ist ja eigentlich auch logisch).
    Womit muss ich nun Arbeiten, sodass ich, sobald ich eine Zelle Anwähle und Text eingebe, die Tabelle Alphabetisch Sortiert wird und der Erstbeste Treffer Markiert wird?
    Ich geb dazu mal ein kleines beispiel.
    1. Kleinhandel Hans KG
    2. KleisterMeister OHG
    3. Angie's Sportclub GmbH
    nehmen wir mal an, so würden wir das nun in meiner Besagten Tabelle vorfinden. die Zahlen stehen in der Spalte KundenID die Namen in der Spalte Firma
    klicke ich nun z.B auf den Kleinhandel und würde nun ein "k" eintippen, so soll die Tabelle Alphabetisch geordnet werden und die Selection auf dem ersten treffer in der Sortierung liegen,
    in diesem Falle der Kleinhandel Hans KG
    gebe ich nun jedoch "kleis" ein so soll die Tabelle nach wie vor Alphabetisch sortiert sein, die selection nun jedoch auf der KleisterMeister OHG liegen.
    in keinem Falle soll "nurnoch" die firma KleisterMeister ausgegeben werden, sondern immer alle Einträge der Tabelle, bzw. der Datenbank sichtbar bleiben.

    Den Text kann ich bereits Abfangen, doch weis ich nicht wohin damit, da ich bisher immer mit SQL gearbeitet habe, was mir in diesem Fall, so meine ich, jedoch nichts nützt.
    so, kann mich erst heute wieder melden...

    ich hab mir deinen Link angesehen, und mich auch durch die Code-Fragmente gearbeitet, sie extra dafür in VB convertieren lassen, doch...entweder bin ich blind, oder finde ich darin wirklich nicht das, was ich suche, ebenso empfinde ich die SQL-Anweisung etwas kryptisch... dennoch werde ich mir die Seite mal als Lesezeichen hinzufügen, wer weis wann man das mal wieder gebrauchen kann.
    LEdiglich eine Stelle scheint von nutzen sien zu können....

    Quellcode

    1. protected void dgProductN_SortCommand(object source, DataGridSortCommandEventArgs e)
    2. {
    3. DataSet ds = (DataSet)Session["Data"];
    4. DataView dv = new DataView(ds.Tables["Product"]);
    5. if ((numberDiv % 2) == 0)
    6. dv.Sort = e.SortExpression + " " + "ASC";
    7. else
    8. dv.Sort = e.SortExpression + " " + "DESC";
    9. numberDiv++;
    10. dgProductN.DataSource = dv;
    11. dgProductN.DataBind();
    12. }

    was dann in VB ungefähr so aussehen müsste: (nicht von hand umgeschrieben, also nicht mein Werk)

    VB.NET-Quellcode

    1. Protected Sub dgProductN_SortCommand(source As Object, e As DataGridSortCommandEventArgs)
    2. Dim ds As DataSet = DirectCast(Session("Data"), DataSet)
    3. Dim dv As New DataView(ds.Tables("Product"))
    4. If (numberDiv Mod 2) = 0 Then
    5. dv.Sort = Convert.ToString(e.SortExpression) & " " & "ASC"
    6. Else
    7. dv.Sort = Convert.ToString(e.SortExpression) & " " & "DESC"
    8. End If
    9. numberDiv += 1
    10. dgProductN.DataSource = dv
    11. dgProductN.DataBind()
    12. End Sub
    jedoch steht dort etwas von einem "EventHandler DataVIEW" in der Beschreibung, was mich etwas verwirrt...

    sollte ich vielleicht anfügen, dass ich mit WPF arbeite? in deinem Link wird von ASP.Net DataGrid gesprochen... nur falls sich dadurch etwas ändern sollte.
    Also ich bin gerade so weit, dass ich ein DG hab, das mir bei start sämtliche Datensätze anzeigt.
    Klicke ich nun in i-eine belibeige Zelle hinein, und tippe darin etwas ein, so wird innerhalb dieser Spalte nach dem getippten gesucht.
    Logischerweise passiert das in der Datenbank, da ich das per SQL-Anweisung mache, und das DG letztendlich nur die neuen Daten wieder ausgibt.
    Auf obiges beispiel gesehen, klicke ich die Zelle KleisterMeister OHG an, und gebe ein k ein, verschwindet die Angie's Sportclub GmbH und nur die anderen beiden werden in alphabetischer Reihenfolge angezeigt.

    EaranMaleasi schrieb:

    Klicke ich nun in i-eine belibeige Zelle hinein, und tippe darin etwas ein, so wird innerhalb dieser Spalte nach dem getippten gesucht.
    Dassis doch ein völliges Fehlverhalten.
    Wenn man in eine DG-Zelle was reinschreibt, dann ändert man damit normalerweise den Datensatz - sonst nix.

    Um Suchparameter einzugeben verwende besser eine eigene Textbox.

    EaranMaleasi schrieb:

    Logischerweise passiert das in der Datenbank, da ich das per SQL-Anweisung mache, und das DG letztendlich nur die neuen Daten wieder ausgibt.
    Finde ich total unlogisch.
    Wenn alle Daten angezeigt werden, dann kann man auch darin suchen.
    Da muß man nicht eine erneute Abfrage an die DB stellen.
    zu 1. Dieses Fehlverhalten ist aber erwünscht, und in dem zusammenhang wie es genützt wird auch äußert praktisch. die gesamte DG ist ReadOnly, eben damit man keine Datensätze verändern kann, man soll nur sehen, anwählen und in der, durch die ausgewählte Zelle festgelegten Spalte, suchen können.

    zu 2. für mich ist es bisher das logischte gewesen, da ich bisher nicht wusste, wie ich an die Daten, die sich wohl schon bereits im DG befinden (DataSets?) rankommen könnte. Doch nun ist mir klar, dass das ebend nicht mit SQL geht, weswegen ich nach einer anderen Methode frage.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    EaranMaleasi schrieb:

    nicht wusste, wie ich an die Daten, die sich wohl schon bereits im DG befinden (DataSets?) rankommen könnte.

    Na, da, wo das DG dran gebunden ist, da sind die Daten, und an die kannst du ran, vorzugsweise ohne erneute Query.

    Allerdings gibts einige mögliche Szenarien, wies gebunden sein kann, und wies bei dir nun aussieht, weiß ich zufällig nicht.
    Die Anbindung erfolgt im Initialized Event, per Data Table

    VB.NET-Quellcode

    1. Private Sub MainWindow_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
    2. xmlDoc.Load("C:\ConnectionString.xml")
    3. xn = xmlDoc.SelectSingleNode("ConnectionString")
    4. sqlConnection1.ConnectionString = xn.InnerText
    5. da = New MySqlDataAdapter("SELECT * FROM `allgemein`", sqlConnection1)
    6. da.Fill(dt)
    7. DataGrid1.DataContext = dt
    8. End Sub

    Ob das nun gut oder schlecht ist mit dem Initialized-Event weis ich nicht... auf jedenfall funktioniert es so bisher einwandfrei.
    Später (in der Entwicklung) wird das ganze noch in eine Funktion einer besonderen Klasse für Datenbankbefehle exportiert

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    jo - da sind deine Daten also in dt drin - was immer das sein mag. Vermutlich was untypisiertes, das macht die Arbeit damit natürlich ziemlich schwierig.

    ah - hier habe ich mal ein kleines Sample, wie man in wpf ein Grid an ein typisiertes Dataset bindet.

    Nicht erschrecken übers Helpers-Projekt: Da ist alles mögliche drin, was zum Teil im eiglichen Projekt gar net gebraucht wird.
    Dateien
    so nach einer woche die ich nun krank war und somit nicht weiterarbeiten konnte, hab ich endlich wieder Zeit mich damit zu befassen.
    Danke erstmal für dein projekt, auch wenn ich mich noch in das fachchinesisch (aus meiner derzeitigen sicht) einarbeiten muss.
    und noch etwas zu den deklarationen,

    VB.NET-Quellcode

    1. Dim sqlConnection1 As New MySqlConnection
    2. Dim xmlDoc As New XmlDocument
    3. Dim xn As XmlNode
    4. Dim da As MySqlDataAdapter
    5. Dim dt As New DataTable
    6. Dim cmd As New MySqlCommand

    wenn das auch nicht weiterhilft, dann werde ich wohl noch einmal das internet durchforsten müssen nach besseren anbindungsmethoden, die meinem zweck dienen.
    ich empfehle dringend, solche dinge wie Dim dt As new DataTable bleibenzulassen.
    Das sind untypisierte Dataset-Elemente, mit denen man kein vernünftiges Databinding einrichten kann - da kannst du dich dumm und dämlich googeln, und bekommst nur Crap raus, eben weils ein Crap-Ansatz ist.

    guck dir lieber das Sample an, und sieh nach, welche der Funktionalität sich mit deinen Anforderungen deckt, und wies gemacht ist.
    Dabei nicht ins Helpers-Projekt gucken, weil da ist viel zu viel drinne.
    Wesentlich ist der Code im Hauptprojekt, und die Tatsache, dasserdoch sehr übersichtlich ist.