Datagridview markierte Row - Wert eines Feldes

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datagridview markierte Row - Wert eines Feldes

    Hallo,

    wie komme ich an den Wert der markierten Row, dort an an bestimmtes Feld?

    Beispiel: ein Feld ist die Kundennummer, jetzt soll mit doppelclick ein Kunde ausgewählt werden und dazu brauch ich zum übergeben die Kundennummer der geklickten Zeile.
    ich empfehle immer, möglichst nicht an den Controls rumzufummeln, sondern Daten immer aus der BindingSource zu holen. Die Current-Property der BindingSource liefert den aktuellen Datensatz, von dem du nicht nur die KundenNummer abrufen kannst, sondern alle anneren Properties auch.

    Im Grunde geht es in diesem Fall ebensogut auch übers DatagridView, aber andere Anforderungen lassen sich nicht so leicht lösen, und wennde zB. statt eines DGVs eine Combobox gebunden hast, musstes dir wieder ganz anners ausdenken.

    Hingegen wenn man prinzipiell immer über die BindingSource geht, dann ists letztlich egal, welche Controls, ob mehrere, oder ob auch mal garkeins, angeschlossen sind - die Datenverarbeitung interessiert sich garnet dafür.
    gugge Daten laden, speichern, verarbeiten

    VB.NET-Quellcode

    1. dim rwKunde = DirectCast(DirectCast(KundeBindingSource.Current, DataRowView).Row, KundeRow)
    2. msgbox(rwKunde.KundeID.ToString())
    Der doppelte Cast zum Holen der CurrentRow ist zwar grauenhaft, aber man gewöhnt sich dran, und kann diese Zeile überall anbringen, wo mit BindingSource an typDataset gebunden wird.

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

    ich vermute ich frage dämlich: Wie kann ich denn dann mit der gespeicherten Kundennummer (das funktioniert) zu diesem Datensatz springen?

    Also Kunde wurde gesucht, Suchfenster zu, springe zu dem Datensatz der gesucht wurde...
    Elegant wäre in diesem Fall, wenn im Suche-Form einfach an dieselbe BindingSource gebunden ist, welche auch im Eingabe-Form aktiv ist.

    Weil über die Suche würde deren Current ja definiert, und das wäre dann derselbe Current, der auch im EingabeForm angezeigt ist. Aber das stellt schon Formübergreifendes Databinding dar. Und sone Suche kann man nicht canceln und bei der ursprünglichen Eingabe bleiben, weil die flitzt ja gebundenermaßen immer mit mitte Suche.

    Also wirstewohl beim EingabeForm die BindingSource durchsuchen müssen, bis du die gewünschte Row findest

    VB.NET-Quellcode

    1. ''' <summary> stellt die angegebene DataRow ein </summary>
    2. <Extension()> _
    3. Public Function MoveTo(ByVal subj As BindingSource, ByVal row As DataRow) As Boolean
    4. Dim dv = DirectCast(subj.List, DataView)
    5. For i As Integer = 0 To subj.Count - 1
    6. If dv(i).Row Is row Then
    7. subj.CancelEdit() 'ansonsten setzter u.U. beim Moven die vorherige Row auf Rowstate.Changed
    8. subj.Position = i
    9. Return True
    10. End If
    11. Next
    12. Return False
    13. End Function
    das steht da doch alles - du mußt nur hingucken!
    subj ist eine BindingSource, und row ist eine DataRow. Oder wie kann man zeile#3 sonst verstehen?

    Du gibst dieser Methode eine BindingSource und eine DataRow, und die BindingSource sucht, ob und wo sie diese DataRow enthält. Dann stellt sie ihre Position darauf ein.

    Der effekt ist, dass die PositionsVeränderung der BS bewirkt, dass alle daran angebundenen Controls auf den neuen Datensatz umspringen - deshalb heißt die Methode .MoveTo()

    So, und nun sag du mir, wann diese Methode True, und wann sie False zurückgibt. ;)
    Der Datensprung klappt nicht, hier mal meine Codes:

    In der Eingabemaske:

    VB.NET-Quellcode

    1. Private Sub Kundenauswahl_Click(sender As System.Object, e As System.EventArgs) Handles Kundenauswahl.Click
    2. Kundensuchen.ShowDialog()
    3. MsgBox(Kundensuchen.xKundensuch)
    4. Call MoveTo(KundenBindingSource, Kundensuchen.xRow)
    5. End Sub

    in Form Kundensuchen:

    VB.NET-Quellcode

    1. Public xKundensuch As Integer
    2. Public xRow As DataRow

    und

    VB.NET-Quellcode

    1. Private Sub KundenDataGridView_CellContentDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles KundenDataGridView.CellContentDoubleClickDim
    2. rwKundensuch = DirectCast(DirectCast(KundenBindingSource.Current, DataRowView).Row, DataSetKunden.KundenRow)
    3. 'MsgBox(rwKundensuch.KdNr.ToString())
    4. xKundensuch = rwKundensuch.KdNr
    5. xRow = rwKundensuch
    6. Me.Close()
    7. End Sub

    Im Ergebnis klappt die Übergabe der Kundennummer von der Kundensuche (deshalb die Messagebox), die mir ja aber nicht weiterhilft.
    Was aber nicht klappt, ist dass er dann zum richtigem Datensatz in der Eingabemaske springt.
    Wo ist mein Fehler?

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

    Ah - Form-übergreifend:

    Dein FormSuche hat nicht zufällig ein eigenes Dataset, welches eigens befüllt wird?

    Weil die DataRows sind dann natürlich andere als diejenigen, die im EingabeForm sind, welches ebenfalls eigens befüllt wurde?

    Also nicht, dass du dieselben Daten dir mehrmals aus der DB holst, und dann inne Client-Anwendung doppelt hälst? Weil das würde ja zu Redundanz-Problemen führen ;)

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

    nein ich habe nur ein Dataset "DatasetKunden"

    in der Form Eingabemaske ist übrigens kein Datagridview, sondern halt Eingabefelder über Textboxen...

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

    Ich rede auch nicht von DataGridView, sondern von Datasets

    gugge im FormDesigner dein EingabeForm: Ist da unten etwas, was "XYDataset" heißt, oder "DatasetKunden", oder "DatasetKundenDataset" oder so?

    nu gugge im FormDesigner dein SucheForm: Ist da unten etwas, was "XYDataset" heißt?
    ja, und damit sinds 2 Datasetse: eins im EingabeForm und eins im Such-Form.
    Ist - datenbänkerisch gesehen - Müll, und was ein Redundanz-Problem ist, weißt du jetzt ja auch (obwohl: es gibt noch viele weitere Varianten).

    Naja, mit folgendem kannst du den Index einer DataRow finden, die in einer bestimmten Spalte einen bestimmten Wert hat (als Spalte die PrimKeySpalte eingeben, wenn du nach Primkey-Werten suchst):

    VB.NET-Quellcode

    1. <Extension()> _
    2. Public Function FindX(ByVal subj As BindingSource, ByVal columnName As String, ByVal Key As Object) As Integer
    3. 'BindingSource.Find funzt nicht bei relateten BindingSourcses
    4. 'FindX = subj.Find(PropertyName, Key)
    5. For i As Integer = 0 To subj.Count - 1
    6. If DirectCast(subj(i), DataRowView)(columnName).Equals(Key) Then Return i
    7. Next
    8. Return -1
    9. End Function
    anschließend dann BindingSource.Position auf diesen Index setzen.

    Oder du packst die Suche aufs selbe Form wie die Eingabe, dann verwenden sie ja dasselbe Dataset, und dann funzt auch oben genannte MoveTo-Methode.