Selectierte in DGV im DataSet wiederfinden (Selected)

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    Selectierte in DGV im DataSet wiederfinden (Selected)

    Hi,
    - Typisiertes DataSet
    - Anzeige im DGV
    - Alle Selectierten ROWs im DataSet wieder finden.

    Mann kann ja die selectierte Row im DataSet wiederfinden mit

    VB.NET-Quellcode

    1. ' Adress ID auslesen
    2. Dim rwAdr = DirectCast(DirectCast(AdressenBindingSource.Current, DataRowView).

    hiet geht es über den Current

    Aber wie mach ich das wenn das DGV Multiselect eingestellt ist ?
    Also mehrere Rows markiert sind.

    Wie würde die Schleife aussehen ?

    vielen dank

    Bernd
    HerrFrie
    danke.
    Das über den DGV abzufragen ist keine schöne Lösung.
    Davon wird in vielen Beiträgen, auch bei MSDN, abegraten. Spätere ändereungen am Programm werden dann mühselig.

    Ich wollte es über das DataSet realisieren.
    Ich habe gestern einige Stunden Wege gesucht.
    Ich finde aber nur Current in der BindingSource.


    danke
    Bernd
    Ich glaube das wird schwierig.
    Die Binding-Source hat keine Multiline Funktion. Die Selektierten Reihen wirst du schon über das DGV holen müssen.

    Ich weiß ja nicht, wie oder was du mit den Reihen machen möchtest, aber vielleicht würde es dir dann helfen, wenn du anhand der Indexe z.B. die ID Spalte der selektierten Reihen ausliest, damit du mit diesen dann auf das DS zugreifen kannst.
    Multiselection wird inne BindingSource nicht wiedergespiegelt - die spiegelt nur die Single-Selection über die BindingSource.Position - und .Current - Properties.

    Mehrere selectierte Indizees muß man also aus dem DGV abfragen. Wohlgemerkt - nur die Indizees, nicht die DataRows!
    Die DataRow am Index bekommste per

    VB.NET-Quellcode

    1. Dim rwAdr = DirectCast(DirectCast(AdressenBindingSource(Index), DataRowView).Row,AddressRow)

    Ich empfehle aber wirklich, meine Extensions zu verwenden, damit schreibt sich das

    VB.NET-Quellcode

    1. Dim rwAdr = AdressenBindingSource.At(Of AddressRow)(Index)
    also dieser gräsliche doppelte Cast ist weggekapselt
    Ich danke euch beiden,

    dann werde ich mal über den Index der DGV gehen.
    Bleibt jetzt rauszufinden ob der Index der DGV immer gleich des DataSet ist !

    EDR:
    deine Extension ist laut deiner Beschreibung nicht für MySql.
    Außerdem würde ich es dann nicht lernen.
    Das käme einem C&P gleich.

    nochmals danke ihr beiden.

    Bernd
    nein - ich meine nicht die DBExtensions insgesamt, sondern nur die Datei BindingSourceX im WinFormHelpers-Projekt.

    Natürlich am besten wäre, du übernimmst die GeneralHelpers und WinformHelpers, aber als kleine Lösung reicht es, ein Modul zuzufügen, und da hinein diese Extension-Methods (bitte Copy&Paste!):

    VB.NET-Quellcode

    1. Imports System.Linq
    2. Imports System.Collections
    3. Imports System.Collections.Generic
    4. Imports System.Data
    5. Imports System.Diagnostics
    6. Imports System.Runtime.CompilerServices
    7. Imports System.ComponentModel
    8. Public Module BindingSourceX
    9. ''' <summary> returnt die typisierte Datarow an aktueller Position - oder Nothing. </summary>
    10. <Extension()> _
    11. Public Function At(Of T As DataRow)(ByVal subj As BindingSource) As T
    12. Return DirectCast(subj.At(subj.Position), T)
    13. End Function
    14. ''' <summary>
    15. ''' returnt die typisierte Datarow am index. Bei ungültigem index Nothing (keine OutOfRange-Exception!)
    16. ''' </summary>
    17. <Extension()> _
    18. Public Function At(Of T As DataRow)(ByVal subj As BindingSource, ByVal index As Integer) As T
    19. Return DirectCast(subj.At(index), T)
    20. End Function
    21. ''' <summary> returnt die untypisierte Datarow an aktueller Position. </summary>
    22. <Extension()> _
    23. Public Function At(ByVal subj As BindingSource) As DataRow
    24. Return subj.At(subj.Position)
    25. End Function
    26. ''' <summary>
    27. ''' returnt die Datarow am index. Bei ungültigem index Nothing (keine OutOfRange-Exception!)
    28. ''' </summary>
    29. <Extension()> _
    30. Public Function At(ByVal subj As BindingSource, ByVal index As Integer) As DataRow
    31. If index < 0 OrElse index >= subj.Count Then Return Nothing
    32. Return DirectCast(subj(index), DataRowView).Row
    33. End Function
    34. <Diagnostics.DebuggerStepThrough()> _
    35. <Extension()> _
    36. Public Function AddNewX(Of T As DataRow)(ByVal subj As BindingSource) As T
    37. Return DirectCast(DirectCast(subj.AddNew(), DataRowView).Row, T)
    38. End Function
    39. <Extension()> _
    40. Public Function All(Of T As DataRow)(ByVal subj As BindingSource) As IEnumerable(Of T)
    41. Return From drv In subj.Cast(Of DataRowView)() Select DirectCast(drv.Row, T)
    42. End Function
    43. End Module
    wobei AddNewX und All auch schon Zugaben sind, die du erst später brauchen wirst.
    Außerdem würde ich es dann nicht lernen.
    Wie du siehst - es handelt sich um Ein- oder Zweizeiler - das wirst du doch noch lernen können - du kannst ja auch fragen.
    So,
    hab en par minuten zeit.

    Ich werde also übers DGV gehen. Aus folgendem Grund.
    Ich habe mir eine Klasse geschrieben. Die ein DGV als Tabelle ausdruckt.
    Egal wie viele Seiten. Dieser Klasse übergebe ich eine List of.
    Woher die Daten kommen ist der List of egal.
    Bevor ich nun kompliziert über das DataSet gehe, kann ich ich auch so belassen.

    Es war halt nur in mehreren Threads so beschrieben. "Nicht über das DGV"

    @EDR
    Das mit den Extension ist mir klar. Kenne ich bereits aus derKurt seinem Tool.
    Ist eine schöne sache.

    Und das ich das auch alleine hinbekomme ! Hoffe ich doch.
    Was aber bis heute nicht geklärt ist.
    In einem unserer vielen Threads war von mir die Frage.

    Die Innere DirectCast verstehe ich

    VB.NET-Quellcode

    1. Dim rwAdr = DirectCast(DirectCast(AdressenBindingSource.Current, DataRowView).Row, AdressenRow)

    Aber die äußere nicht.
    Und solange ich das nicht blicke, werde ich nicht Experimentieren mit Extension usw.
    verbietet mir mein Stolz.


    Und nochmals danke für dein C&P.
    Da kann ich dann wieder lesen, suchen, verstehen....


    danke

    Bernd schrieb:

    Was aber bis heute nicht geklärt ist.
    In einem unserer vielen Threads war von mir die Frage: Die Innere DirectCast verstehe ich

    VB.NET-Quellcode

    1. Dim rwAdr = DirectCast(DirectCast(AdressenBindingSource.Current, DataRowView).Row, AdressenRow)

    Aber die äußere nicht.
    ich bin mir ziemlich sicher, diese Frage damals beantwortet zu haben.

    Aber vlt. wirkts in 2 Stufen verständlicher:

    VB.NET-Quellcode

    1. Dim drv = DirectCast(AdressenBindingSource.Current, DataRowView)
    2. Dim rwAdr = DirectCast(drv.Row, AdressenRow)

    So besser?

    Hintergrund ist, dass in einer BindingSource eben nicht DataRows direkt drinne sind, sondern diese komischen DataRowView-Dinger.
    Deshalb muß man erst das DataRowView ausse BindingSource rausholen, und dann die Row wiederum ausssm DataRowView. Und Casten.
    Was ein DataRowView ist, kannste im ObjectBrowser nach suchen, aber vlt. kannst du ja auch erahnen, dasses eine Property Row As DataRow hat, und diese untypisierte Row muß man auf den Ziel-Row-Typ casten, um aller generierten Features teilhaftig zu werden.

    Jo, und wenn man nun den ausdruck fürs drv in den ausdruck für die typisierte Row einsetzt, endet man mit angegebenem doppelten Cast.

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

    So nun nochmals zu Post 5 und 7.
    Extension und Doppelter DirectCast

    Wenn ich mir die Hintergründe so anschaue, blicke ich, glaube ich, langsam durch.(hat ja auch lange genug gedauert)
    Beschreibung die gut Verständlich war Post 9:
    Spoiler anzeigen
    Hintergrund ist, dass in einer BindingSource eben nicht DataRows direkt drinne sind, sondern diese komischen DataRowView-Dinger.
    Deshalb muß man erst das DataRowView ausse BindingSource rausholen, und dann die Row wiederum ausssm DataRowView. Und Casten.


    Jetzt habe ich aber noch eine Frage, und zwar zu deinen Extension
    Wieso kann mann Zwei Functionen mit dem selben Name erstellen ? und der weis welchen er nehmen soll?

    VB.NET-Quellcode

    1. ''' <summary> returnt die typisierte Datarow an aktueller Position - oder Nothing. </summary>
    2. <Extension()> _
    3. Public Function At(Of T As DataRow)(ByVal subj As BindingSource) As T
    4. Return DirectCast(subj.At(subj.Position), T)
    5. End Function

    Hier wird ja in .....subj.At(...... wieder eine Funktion aufgerufen.
    Das sah im ersten Moment so aus, als würde er sich selber wieder aufrufen.(Also Recursive)
    Bei genauerem hinsehen und Studieren, habe ich gesehen das er die nächste Function aufruft.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' returnt die Datarow am index. Bei ungültigem index Nothing (keine OutOfRange-Exception!)
    3. ''' </summary>
    4. <Extension()> _
    5. Public Function At(ByVal subj As BindingSource, ByVal index As Integer) As DataRow
    6. If index < 0 OrElse index >= subj.Count Then Return Nothing
    7. Return DirectCast(subj(index), DataRowView).Row
    8. End Function


    Vielen Dank
    Ich die Nervensäge Bernd

    Bernd schrieb:

    Ich die Nervensäge Bernd
    ich muß sagen, dassis Balsam für meine Nerven!

    Viel mehr frustrieren mich Fragesteller, die meine Informationen nicht verstehen, und darauf "reagieren", indem sie sie ignorieren, und dumm bleiben (Sesamstraße: "Wer nicht fragt bleibt dumm")

    Zur Frage: Das nennt man "Überladung", und das ist ein ganz grundlegendes Feature objektorientierter Programmierung: Der Compiler ist intelligent genug, gleichnamige Methoden und Properties auseinander zu halten, wenn sich die Signaturen unterscheiden. Der Begriff "Signatur" ist u.a. in Alles über Events erläutert, ansonsten suchma in MSDN.
    (Witz: MSDN Online hat gar keine (brauchbare) Suche-Funktion, also über Google nach MSDN-Artikeln suchen)
    oder: dieses Buch Lesen
    ok, das Ding ist uralt, aber thematisch aktuell.

    ​Das ursprüngliche Problem ist doch, dass hier mehrere Zeilen im DataGridView selektiert sind und nun diese Daten in de Bindingsource wiedergefunden werden sollen.

    Grid und Bindingsource sind verbunden, ok.
    Nur wenn ich jetzt die Selektion im Grid durchlaufe und dann in der Schleife die BindingSource.Current setze, wird doch die Selektion im Grid aufgehoben?

    ​Szenario: Ein Grid zeigt 10 Zeilen einer BindingSource an. 5 nicht zusammenhängende Zeilen sollen in bestimmten Spalten die gleichen Werte erhalten, bspw. ein bestimmtes Datum.

    Wenn ich jetzt

    VB.NET-Quellcode

    1. ​For i = Datagridview1.SelectedRows.Count - 1 To 0 Step -1
    2. Dim rw = DirectCast(DirectCast(bindingsource1.Current, DataRowView).Row, dataset1.tabellerow)


    ​mache, wird doch die Selektion des Grids durch die Bindingsource entfernt?

    ​Müsste ich nicht zuerst alle selektierten GridRow-Indizees irgendwo speichern und danach erst danach auf die bindingsource1.current gehen?
    Da das Thema uralt ist und eh ein neuer Thread eröffnet wurde (Bindingsource und DataGridView - Multiselect): Geschlossen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: