Selektierte DataGridView Zellen zwischenspeichern

  • VB.NET

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

    Hallo,

    mann kann ganz einfach eine List(of Point) dafür nehmen in der die CellAdresses gespeichert sind.

    VB.NET-Quellcode

    1. Dim liste As New List(Of Point)
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. liste.Clear()
    4. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    5. For j As Integer = 0 To DataGridView1.ColumnCount - 1
    6. If DataGridView1.Rows(i).Cells(j).Selected Then
    7. liste.Add(New Point(i, j))
    8. End If
    9. Next
    10. Next
    11. End Sub
    12. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    13. DataGridView1.ClearSelection()
    14. For i As Integer = 0 To liste.Count - 1
    15. DataGridView1.Rows(liste(i).X).Cells(liste(i).Y).Selected = True
    16. Next
    17. End Sub


    mfG

    Derfuhr

    Lightsource schrieb:

    später wieder zurück kopieren.
    Das dauert wesentlich länger, du musst ja eine flache Kopie einer Collection erstellen.
    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!
    Hab´s mal versucht, ist zum einlesen ohne schleife möglich, aber zum erneuten setzen braucht man wohl doch eine.

    VB.NET-Quellcode

    1. Dim asd As DataGridViewSelectedCellCollection
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. DataGridView1.ClearSelection()
    4. For Each c As DataGridViewCell In asd
    5. DataGridView1.Rows(c.RowIndex).Cells(c.ColumnIndex).Selected = True
    6. Next
    7. End Sub
    8. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    9. asd = DataGridView1.SelectedCells
    10. End Sub


    mfG

    Derfuhr
    Tja, pech.
    .ForEach() ist eine Extension, die ich gecodet hab.
    Also nur für User meiner Helpers.Dll verfügbar :D

    Ach, und ob ich das mit deiner Syntax gemacht hab, weißichnichmalmehr. ich glaub müsste so:

    VB.NET-Quellcode

    1. asd.OfType(Of DataGridViewCell).ForEach(Sub(c) c.Selected = True)
    Ich bekomme für c.RowIndex immer -1

    Zudem spinnt mein Debugger total und
    will mir keine Ausgaben über Debug.Print für c.RowIndex.toString geben.
    Er überspringt einfach alle damit zusammenhängende Debug.Print Befehle.

    Stimmt mit dem c.RowIndex as DataGridViewCell irgend etwas nicht?
    Ich weiß schon, hatte mich wohl missverständlich ausgedrückt

    For Each c As DataGridViewCell In asd
    DataGridView1.Rows(c.RowIndex).Cells(c.ColumnIndex).Selected = True
    Next


    hier sollte es aber schon funktionieren, dass man den RowIndex aus c erhalten kann.
    klappt aber nicht

    VB.NET-Quellcode

    1. Dim c As DataGridViewCell = Nothing
    2. For Each c In selCells
    3. If c.ColumnIndex > 0 AndAlso c.ColumnIndex <= DGV.ColumnCount - 1 AndAlso c.RowIndex > 0 AndAlso c.RowIndex <= DGV.RowCount - 1 Then
    4. c.Selected = True
    5. End If
    6. Next


    Ich brauche eine Abfrage auf Plausibilität, weil es möglich ist, dass inzwischen das DataGridView
    weniger Zeilen oder Spalten hat, als vor der Selektion. Dabei ist mir aufgefallen, dass c.RowIndex im Gegensatz
    zu c.ColumnIndex immer auf -1 stand obwohl der Count auf meinetwegen 10 war.

    Oder hab eich etwas übersehen?

    Lightsource schrieb:

    weniger Zeilen oder Spalten hat, als vor der Selektion


    Hallo,

    Sobald sich die CellAdresses geändert hat bekommt man Rowindex=-1 Column = 0 zurück aus der Collection, selbst wenn du eine List of Point nimmst würde die alte Celladresse gespeichert, dann wären also die falschen Cell´s wieder selektiert.
    (z.B. alter rowindex 2, eine Zeile drüber entfernen, dann muss der rowindex 1 sein. Mit den Colums verhält es sich auch so.)

    mfG

    Derfuhr
    Ich wollte ja auch keine Zellen mehr selektieren sobald sich etwas an der Anzahl geändert hat.

    Bei mir ist es aber so, dass wenn ich mit For Each durch die gespeicherten Zellenadressen gehe,
    zwar verschiedene Werte für die Spalten bekomme, aber der RowIndex immer auf -1
    stehen bleibt. Das verstehe ich nicht.

    in der MSDN steht:

    Wenn die RowIndex-Eigenschaft -1 zurückgibt, stellt die Zelle entweder einen Spaltenheader dar, oder die Zeile der Zelle ist freigegeben.



    Spalten header habe ich aber nicht selektiert. Und freigegeben weiß ich jetzt nicht was damit in meinem Fall gemeint sein kann.
    Immerhin arbeite ich doch mit einer Kopie der Selektion, oder?


    Wenn ich einen Haltepunkt beim IF setze kann ich bei jedem Schleifendurchlauf sehen, wie
    der ColumnIndex hoch läuft, während der RowIndex immer auf -1 bleibt.

    VB.NET-Quellcode

    1. Public Class class_ZellenHandel
    2. Private selCells As DataGridViewSelectedCellCollection
    3. Sub SaveSelection(ByVal DGV As DataGridView)
    4. selCells = DGV.SelectedCells
    5. End Sub
    6. Sub SetSelection(ByVal DGV As DataGridView)
    7. DGV.ClearSelection()
    8. Dim c As DataGridViewCell = Nothing
    9. For Each c In selCells
    10. If c.ColumnIndex > 0 AndAlso c.ColumnIndex <= DGV.ColumnCount - 1 AndAlso c.RowIndex > 0 AndAlso c.RowIndex <= DGV.RowCount - 1 Then
    11. c.Selected = True
    12. End If
    13. Next
    14. End Sub
    15. End Class
    Ich habe mal die Funktionen zuhause mit VB2010 express gestestet.

    Zuhause klappt es!


    An was kann so etwas liegen?
    Kann jemand mit VB2008-pro mal testen, ob es bei ihm funktioniert?

    Eine Form mit DGV1=DataGridView1, Button1, Button2

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim n As Integer
    3. Dim asd As DataGridViewSelectedCellCollection
    4. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. For Me.n = 0 To 10
    6. DGV1.Rows.Add()
    7. For i As Integer = 0 To DGV1.ColumnCount - 1
    8. DGV1(i, n).Value = (i * n).ToString
    9. Next
    10. Next n
    11. End Sub
    12. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    13. DGV1.ClearSelection()
    14. For Each c As DataGridViewCell In asd
    15. If c.ColumnIndex > 0 AndAlso c.ColumnIndex <= DGV1.ColumnCount - 1 AndAlso c.RowIndex > 0 AndAlso c.RowIndex <= DGV1.RowCount - 1 Then
    16. Debug.Print(c.RowIndex.ToString)
    17. c.Selected = True
    18. End If
    19. Next
    20. End Sub
    21. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    22. asd = DGV1.SelectedCells
    23. End Sub
    24. End Class
    Danke fürs Testen.
    Das ist eigenartig. Da muss ich mir wohl mein VB irgendwie zerschossem haben.
    Vor allem auch darum, weil Debuggen innerhalb der Each Schleife nicht geht.
    Ich werde noch andere Frameworks testen, aber das wäre auch komisch,
    wenn es daran läge.
    Momentan bin ich auf einem 64er System mit Framework 3.5 Windows 7 Any-CPU

    Lightsource schrieb:

    Da muss ich mir wohl mein VB irgendwie zerschossem haben.
    Vielleicht bereinigst Du mal die Projektmappe und erstellst alles neu.
    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!