Datengrbundenes DGV, Einträge rauf u. runter innerhlab d. DGV verschieben und so solls bleiben

  • VB.NET

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

    Datengrbundenes DGV, Einträge rauf u. runter innerhlab d. DGV verschieben und so solls bleiben

    Hallo,

    ich muß euch mit meinem letzten Problem was mein kleines Projekt angehot behelligen :)

    Ich habe ein Datagridview, das ist datengebunden über DataSet usw.

    In diesem DGV ist es sehr wichtig, dass die Reihenfolge der Positionen stimmt- der Anwender muß die Positionen rauf und runter schieben können, denn so wie es da im DGV steht wird anschließend ein Bild aus Grafiken zusammengestellt. Wenn der Aufbau nicht stimmt, stimmt a die Grafik nicht und ggf. auch eine Bauphysikal.berechnung nicht.

    Ich dachte die einfachste Variante ist, dass ich zwei Buttons habe- einmal selektiertes Row im DGV rauf und ein Button für runter.

    Das Dataset hat einige Felder :pinch: unter anderem (klar) die ID und habe auch ein Feld eingerichtet für Sortierung (A_Sort).


    Ich habe leider noch überhaupt keinen Ansatz wie ich das lösen könnte... Vielleicht habt Ihr da eine Idee an die ich mich klammern könnte ??


    Bisher mache ich das so: -was aber echt kacke ist :whistling:

    1. Artikel reinziehen
    2. den 2. Artikel reinziehen
    3. den zweiten Artikel selektieren und dan den 3. Artikel reinziehen

    der Code:

    VB.NET-Quellcode

    1. Dim foundRow As DataRow = ProgrammDatenSet.Tables("Bauteile").Rows.Find(ReferenzId)
    2. 'Dim Dt_Id As Integer = Me.ProgrammDatenSet.AltDach.Count - 1
    3. Dim SortID As Integer = Me.ProgrammDatenSet.AltDach.Count
    4. Dim Wdw As Double = 0
    5. 'Dt_Id += 1
    6. SortID += 1
    7. System.Threading.Thread.Sleep(250)
    8. If foundRow IsNot Nothing Then
    9. Try
    10. Dim oRow As System.Data.DataRow
    11. oRow = Me.ProgrammDatenSet.AltDach.NewRow ' nicht eine vorhandene Zeile kopieren!
    12. 'oRow.Item(0) = Dt_Id
    13. oRow.Item(1) = foundRow.Item(0)
    14. oRow.Item(2) = foundRow.Item(2)
    15. oRow.Item(3) = foundRow.Item(3)
    16. oRow.Item(4) = foundRow.Item(4)
    17. oRow.Item(5) = foundRow.Item(5)
    18. oRow.Item(6) = foundRow.Item(6)
    19. oRow.Item(7) = foundRow.Item(7)
    20. oRow.Item(8) = foundRow.Item(8)
    21. oRow.Item(9) = foundRow.Item(9)
    22. oRow.Item(10) = foundRow.Item(10)
    23. oRow.Item(11) = SortID
    24. Wdw = CDbl(foundRow.Item(6)) / CDbl(foundRow.Item(3))
    25. oRow.Item(12) = Wdw
    26. oRow.Item(13) = foundRow.Item(12)
    27. oRow.Item(14) = foundRow.Item(13)
    28. If Me.ProgrammDatenSet.AltDach.Count > 0 Then
    29. Me.ProgrammDatenSet.AltDach.Rows.InsertAt(oRow, AltDachDataGridView.Rows(AltDachDataGridView.CurrentRow.Index).Cells(11).Value)
    30. Else
    31. Me.ProgrammDatenSet.AltDach.Rows.Add(oRow)
    32. End If
    33. Catch ex As Exception
    34. MessageBox.Show(ex.Message)
    35. End Try
    36. Dim view As DataView = Me.ProgrammDatenSet.AltDach.DefaultView
    37. view.Sort = "A_Sort"
    38. UWert_berechnen_AD()


    das der nicht besonders toll ist, weis ich 8|

    daher bitte ich euch mal wieder, mir einen ordentlichen klaps auf den Kopf zu geben :)

    Danke & liebe Grüße
    lris


    EDIT:

    so war auch ein Versuch: -> aber das es ja datengebunden ist gibts die Fehlermeldung: Zeilen können nicht automatisch zur Zeilenauflistung der DataGridView hinzugefügt werden, wenn das Steuerelement datengebunden ist.

    Der Code:

    VB.NET-Quellcode

    1. Private Sub btn_AdUp_Click(sender As System.Object, e As System.EventArgs) Handles btn_AdUp.Click
    2. 'Eintrag eine Zeile nach oben verschieben
    3. Dim Ind As Integer
    4. Ind = AltDachDataGridView.CurrentCell.RowIndex
    5. If Ind = 0 Then Exit Sub
    6. AltDachDataGridView.Rows.InsertCopy(Ind, Ind - 1)
    7. AltDachDataGridView.Rows.Remove(AltDachDataGridView.Rows(Ind + 1))
    8. End Sub


    * Topic verschoben *

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

    Ich habs so hinbekommen :) Jaaaaaaaaa ich habs geschafft :thumbsup: :thumbsup:

    hier... wer's mal braucht :) Datengebundenes DGV - Zeile rau&runter :)

    VB.NET-Quellcode

    1. Private Sub btn_AdUp_Click(sender As System.Object, e As System.EventArgs) Handles btn_AdUp.Click
    2. Dim Idx As Integer = AltDachBindingSource.Position
    3. Dim DR As DataRow = AltDachBindingSource.Item(AltDachBindingSource.Position - 1).Row
    4. Dim DRx As DataRow = ProgrammDatenSet.AltDach.NewRow
    5. DRx.ItemArray = DR.ItemArray
    6. ProgrammDatenSet.AltDach.Rows.RemoveAt(Idx - 1)
    7. ProgrammDatenSet.AltDach.Rows.InsertAt(DRx, Idx)
    8. AltDachDataGridView.AutoResizeRow(Idx)
    9. AltDachBindingSource.Position = Idx - 1
    10. End Sub
    11. Private Sub btn_Addown_Click(sender As System.Object, e As System.EventArgs) Handles btn_Addown.Click
    12. Dim Idx As Integer = AltDachBindingSource.Position
    13. Dim DR As DataRow = AltDachBindingSource.Item(AltDachBindingSource.Position + 1).Row
    14. Dim DRx As DataRow = ProgrammDatenSet.AltDach.NewRow
    15. DRx.ItemArray = DR.ItemArray
    16. ProgrammDatenSet.AltDach.Rows.RemoveAt(Idx + 1)
    17. ProgrammDatenSet.AltDach.Rows.InsertAt(DRx, Idx)
    18. AltDachDataGridView.AutoResizeRow(Idx)
    19. AltDachBindingSource.Position = Idx + 1
    20. End Sub
    Benötige wie schon in #1 beschrieben, eine Möglichkeit die Reihenfolge der Zeilen im Datagridview zu ändern. Das funktioniert mit dem Code aus #3 recht gut, da ich den Inhalt der Zellen in eine PDF schreibe und da ist die Reihenfolge entscheidend.

    Mein Problem ist nun, dass ich aber zwei Datagridviews habe, wobei die Reihenfolge nur im ersten zu ändern wäre.
    Die Vorlage habe ich von hier, was das gebundene Dataset angeht:
    DatasetOnly: DB-Programmierung ohne Datenbank

    Wenn ich nun im DGV1 die Reihenfolge ändern, löscht es mir den Inhalt der gebundenen Daten vom DGV2.

    Hat einer einen Tipp für mich, wie ich das Problem lösen kann?


    Standardmäßig ist die Reihenfolge der DataRows unbestimmt in einer DataTable.

    Das einzige was man machen kann, ist sie sortieren, nach diesm oder jenem Kriterium.

    Haben die Datensätze kein Kriterium, kann man sie nicht danach sortieren.

    Ich mache gelegentlich eine Rank As Integer-Property an meine Datensätze - danach kann ich dann sortieren.
    Ist umständlich, aber weiß niht besser.
    OK, an so etwas habe ich auch schon gedacht.
    Meinst Du mit Rank As Integer - Property eine weitere Spalte zum sortieren hinzufügen und die Reigenfolge dort durch zahlen von 0 bis .... festlegen?

    Wenn ich speichere, übernimmt er aber nicht die neue Reihenfolge.

    Beim erstellen einer neuen DataTable, sieht die ganze Sache soweit ganz gut aus. Wie bekomme ich aber meine zweite DataTable ins Dataset?

    VB.NET-Quellcode

    1. Dim view As New System.Data.DataView(DataSet1.Tables("Category"))
    2. Dim newTable As System.Data.DataTable
    3. view = New System.Data.DataView(DataSet1.Category)
    4. view.Sort = "CategorySort ASC"
    5. newTable = view.ToTable()
    6. newTable.WriteXml("c:\test\neuedaten.xml")

    DavidS schrieb:

    Wenn ich speichere, übernimmt er aber nicht die neue Reihenfolge.
    Dann speicherst du wohl falsch. Btw wie gesagt: In einer DataTable gibt es keine Rehenfolge, also kann er sie auch nicht übernehmen.

    Ansonsten würde ich dir empfehlen, arbeite dich mal in typisierte Datasets und Databinding ein. Sowas untypisiertes wie du es machst ist ziemlich schlechter Stil. Paar Videos zum vlt. auf den Geschmack kommen:

    vier Views-Videos