Typisiertes Dataset - Datagridview - Nur die letzten 10 Einträge anzeigen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    Typisiertes Dataset - Datagridview - Nur die letzten 10 Einträge anzeigen

    Hi,

    gibt es im Designer (Winforms) irgendeine Möglichkeit über Filter und Sortierung zu sagen, dass er mir im Datagridview nur die letzten 10 Einträge anzeigen soll (10 ist jetzt nur nen Dummywert)?
    Sowas wie im SQL ein TOP 10?
    Ich hab mal versucht dazu was zu ergooglen, aber mir scheint als wäre es fast nicht möglich. Oder ich google falsch. Kann auch sein.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @MemoAnMichSelbst Ich würde eine neue DataTable erstellen und die ersten 10 Zeilen reinkopieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    An deinen "Google skills", solltest du nocht etwas feilen ! :D

    Ich habe, mit den Begriffen "Datagridview binding hide rows", auf anhieb was brauchbares gefunden.
    Allerdings habe ich die in meiner Signatur verlinkte custom-search-engine verwendet.
    codeproject.com/Questions/6814…-with-Binding-not-working

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Form1
    3. Public ShowLastRowsCount As Integer = 10
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim testItems As New BindingList(Of TestItem)
    6. For i As Integer = 0 To 20
    7. testItems.Add(New TestItem($"test {i}"))
    8. Next
    9. BindingSource1.DataSource = testItems
    10. DataGridView1.DataSource = BindingSource1
    11. End Sub
    12. Public Sub DataGridView1_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete
    13. Dim _sender As DataGridView = DirectCast(sender, DataGridView)
    14. Dim hideUntillIndex As Integer = _sender.Rows.Count - ShowLastRowsCount
    15. BindingSource1.CurrencyManager.SuspendBinding()
    16. For i As Integer = 0 To hideUntillIndex - 1
    17. _sender.Rows(i).Visible = False
    18. Next
    19. BindingSource1.CurrencyManager.ResumeBinding()
    20. End Sub
    21. Private Class TestItem
    22. Public Property Text As String
    23. Public Property TextLength As String
    24. Public Sub New(ByVal _text As String)
    25. Text = _text
    26. TextLength = _text.Length.ToString
    27. End Sub
    28. End Class
    29. End Class


    Edit:
    Habe eben bemerkt, daß du es etwas anders haben wolltest, macht aber nichts.
    Wenn ich es richtig sehe, ist es entscheident, das Ausbenden im .DataBindingComplete Event zu elredigen.

    Edit2:
    Habe nochmal drüber gebügelt, jetzt läufts wie gewünscht und ohne Fehlermedung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „FormFollowsFunction“ ()

    Hi,

    danke erstmal für die Antworten. Also ist es zusammengefasst nicht möglich das Ganze im Designer abzuwickeln. Hab ich mir auch fast gedacht. Hätte gehofft man kann im Filter etwas bauen wie "ID <= (Min(ID) + 10)" aber hab es damit auch nicht hin bekommen. (ID mit defaultmäßig absteigender Sortierung).

    Meine Frage bezieht sich ausschließlich auf "Im Designer" und nicht per Code.
    Wobei Rods Variante mir wesentlich performanceschonender aussieht, als ne Tabelle mit zB. 130.000 Einträgen zu binden um dann 129.990 Rows auf Visible = False zu stellen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @MemoAnMichSelbst Ich wollte gerade fragen, von wie vielen Datensätzen die Rede ist.
    Klar, bei dieser Anzahl ist es einfacher, nach 10 aufzuhören als bei 10 zu beginnen.
    ====
    Nur kannst Du nicht mit nem Laufindex in der Tabelle per LINQ oder so die Bedingung < 10 formulieren?
    Ich hab da leider keine Ahnung.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Klar geht das mit dem BindingSource-Filter per ID Einstellung. Die Frage ist nur, wie die IDs erstellt werden. Wenn Du das per tDS machen lässt, solltest Du bedenken, dass bei den Defaulteinstellungen die IDs bei -1 anfangen immer kleiner werden, Du also für die ersten 10 Einträge schreiben muss: DeineBindingSource.Filter = "ID >= -10". Für andere Bereiche eben z.B. ID > -20 AND ID <= -10. Vorausgesetzt, dass Deine Tabelle ne Integer-ID-Spalte hat.

    ##########

    ABER: Designer-Einstellung und MIN(ID) sind insoweit effektiv inkompatibel zueinander, weil der Filter ja vor Befüllung festgelegt wird. Und wenn da ID > MIN(ID) + 10 steht, dann werden erstmal alle Zeilen rausgefiltert, weil die BindingSource sich die erstmal leere Tabelle anschaut. Nix drin, dann kommt der 1. Eintrag mit ID -1, wird rausgefiltert. 2. Eintrag mit ID = -2 kommt, wird rausgefiltert, usw.
    Der Filter dürfte also erst angewendet werden, wenn alle Daten in der Tabelle sind. Nachdem also alle Einträge drin sind, müsstest Du dann den Filter erstmal (per Code) entfernen und neu setzen, sonst bekommst Du eben keine Anzeige.

    VB.NET-Quellcode

    1. Dim CurrentFilter = DeineBindingSource.Filter
    2. DeineBindingSource.RemoveFilter()
    3. DeineBindingSource.Filter = CurrentFilter


    Von daher: Ohne Code geht nur die Anzeige der ersten x Einträge, nicht der letzten 10, wegen Variabilität der Indizes. Meines Erachtens.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    VaporiZed schrieb:

    ABER: Designer-Einstellung und MIN(ID) sind insoweit effektiv inkompatibel zueinander, weil der Filter ja vor Befüllung festgelegt wird.

    Das macht Sinn und hatte ich nicht im Auge.
    Ich habe jetzt bei Änderungen einfach das Neu-Setzen des Filters hinterlegt und es klappt wunderbar.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    ... im Designer ...

    Habe ich glatt überlesen, muss wohl an menem afmerksam-lesen-skills feilen. :whistling:
    Warum eigentlich ausschließlich im Designer ?
    Und bei derartig großen Datensätzen ist die von mir gepostete Methode, wohl eher nicht geeignet.
    Bin auf eine Lösung gespannt !
    Mit der Lösung den Filter neu zu setzen funktioniert es.

    VB.NET-Quellcode

    1. Dim CurrentFilter = DeineBindingSource.Filter
    2. DeineBindingSource.RemoveFilter()
    3. DeineBindingSource.Filter = CurrentFilter

    Ich kann dann auch im Designer über die "ID" mit die letzten 10/20/30 Einträge anzeigen.

    Im Filter innerhalb des Designers habe ich
    "ID <= (Min(ID) + 10)" stehen. Die 10 kann ich dann natürlich variieren, wenn es mehr werden soll.

    Mir ging es da nur um das Herausfinden wie es und was schon über den Designer geht. VB.NET ist bei mir nur eine Sprache die ich für kleinere gekapselte Projekte mal benutze und deshalb bin ich mit den Möglichkeiten, die das Studio bietet nicht so vertraut.
    Normal programmiere ich auf Progress in 4GL und das ist ja direktes Programmieren auf der Datenbank. Da geht man immer etwas anders dran ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    Sowas wie im SQL ein TOP 10?
    Du füllst doch dein Tabelle sicher auch mittels SQL-Statement aus einer DB.
    Warum wendest du da nicht gleich deinen Top-10-Filter an?
    Dann musst du dir über eine spätere Filterung keine Gedanken machen?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi,

    petaod schrieb:

    Du füllst doch dein Tabelle sicher auch mittels SQL-Statement aus einer DB.


    Nein, das tue ich nicht. Wenn das so wäre, würde ich es nicht in VB.NET programmieren, sondern direkt in 4GL. Es ist einfach eine XML Datei dahinter. Eine Datenbank ist dafür unnötig und würde auch dem eigentlichen Sinn wieder entgegen gehen. Wie ich das Datenbänkerisch abwickle weiß ich. Es geht mir nur darum, zu lernen wie Visual Studio damit umgeht. Und dabei die Funktionen zu nutzen, die schon da sind (wie zB. die Möglichkeit Daten zu handlen ohne zu programmieren).
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D