Announcement

Collapse
No announcement yet.

Im Debugger funktioniert es... Schleife zu schnell ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Im Debugger funktioniert es... Schleife zu schnell ?

    Hallo Ihr Experten !

    habe da mal wieder ein Problem. Ich habe in meinem Program eine Private Sub um Einträge in einer ListView zu verschieben und zu sortieren, dabei wird relativ viel gemacht, da die Einträge in der ListView 2-3 mal neu Sortiert werden müssen, da für die Sortierung sich die Listview selbst analysieren muss und auch ein paar änderungen an Ihren Einträgen vornehmen muss etc. Deswegen läuft die erste Spalte auf 0001... etc. um da überhaubt ein Nummerische Sortierung hinzubekommen. Für diese Funktion geht die SUB nochmal in eine andere Function um die 0 anzuhängen. Die Sub zum Sortieren funktioniert an sich ohne Probleme und wird über einen Button gestartet. Jetzt soll aber z.B. die Funktion 6 mal hintereinander ausgeführt werden, dafür starte ich in einer Do - Loop While Schleife die SUB so oft bis ein bestimmter Wert erreicht ist. Dabei kommt aber nur Mist raus, Die Einträge stehen dann nicht in der Reihenfolge wie sie sein müssten, wie wenn ich z.B. 5 mal einzeln die Sub über den Button aufrufen würde.

    Das blöde ist, im Debugger funktioniert das ganze, kann sogar per Application.DoEvents auf dem zweiten Monitor beobachten wie die Einträge in der Listview sich nach aufrufen der Sub in der Schleife verändern. Habe mir dann gedacht... Okay, vielleicht geht es etwas zu schnell und habe mit Hilfe von System.Threading.Thread.sleep(1000) Die Schleife verlangsamt, aber trotzdem funktioniert es nicht.

    Irgendeiner ne Idee ???

  • #2
    Warum nicht den String formatieren

    http://msdn.microsoft.com/de-de/libr...vs.100%29.aspx

    oder

    http://msdn.microsoft.com/de-de/library/dd260048.aspx
    Christian

    Comment


    • #3
      Ich check gar nix... etwas weniger Text und mehr Code bitte Den Code dann vielleicht auch gleich noch formatieren wäre super.
      [code]<deinCode>[/code]

      Comment


      • #4
        Okay, hat sich erledigt, war etwas blind, er hat noch auf eine Funktion am ende der Sub zugegriffen die ich testweise rein gemacht habe, die hat alles durcheinander gebracht ! Sorry

        @Christian

        Ich formatiere den String so:

        [highlight=vbnet]Private Function NullGen
        Dim NullGenCount As Integer

        NullGenCount = DEintrag.Length

        If NullGenCount = 1 Then DEintrag = "000" + DEintrag
        If NullGenCount = 2 Then DEintrag = "00" + DEintrag
        If NullGenCount = 3 Then DEintrag = "0" + DEintrag


        End Function[/highlight]

        Da ich nicht weis wie lang der Wert in der ersten Spalte ist (max 4 Zahlen) die kommen über eine Textbox und müssen konvertiert werden.

        Hab da aber noch ein anderes Problemchen, die Ausführung der SUB mehrmals hintereinander dauert relativ lange, wenn diese ca. 50 mal ausgeführt wird, gibt es einen Weg das er das ganze quasi im Hintergrund macht, sprich nicht im Live zu sehen ist ( Visible und Enabled auf False zu setzen bringt da nicht viel).

        Das ist der Code zu der Funktion die mehrmals hintereinander ausgeführt werden muss:
        [highlight=vbnet]
        Dim SollKanalnummer, IstKanalnnummer As String
        Dim CVor1, CVor2, CNach1, Cnach2 As String
        Dim NullGenCount As Integer

        Dim AlterIndex, AICN1, AICV1, CV1, CN1, CV2, CN2, DE, BlockSuche As Integer
        'Jetziger Standort in der Liste mit Umgebungen deklarieren
        On Error Resume Next
        DE = ListView3.SelectedItems(0).Index
        On Error Resume Next
        CV1 = ListView3.SelectedItems(0).Index - 1
        On Error Resume Next
        CVor1 = ListView3.Items(CV1).Text
        On Error Resume Next
        CN1 = ListView3.SelectedItems(0).Index + 1
        On Error Resume Next
        AICN1 = ListView3.SelectedItems(0).Index + 1
        On Error Resume Next
        AICV1 = ListView3.SelectedItems(0).Index + 1
        On Error Resume Next
        CNach1 = ListView3.Items(CN1).Text
        On Error Resume Next
        CV2 = ListView3.SelectedItems(0).Index - 2
        On Error Resume Next
        CVor2 = ListView3.Items(CV2).Text
        On Error Resume Next
        CN2 = ListView3.SelectedItems(0).Index + 2
        On Error Resume Next
        Cnach2 = ListView3.Items(CN2).Text

        DEintrag = ListView3.SelectedItems(0).Text

        Dim WasBlock As Boolean = False
        Dim IstJetztBlock As Boolean = False

        If DEintrag = CNach1 Or DEintrag = CVor1 Then WasBlock = True

        DEintrag = DEintrag + 1
        NullGen(DEintrag)

        For i = 0 To ListView3.Items.Count - 1
        If ListView3.Items(i).Text = DEintrag Then BlockSuche = BlockSuche + 1
        Next

        If BlockSuche > 1 Then IstJetztBlock = True

        ListView3.SelectedItems(0).Text = DEintrag
        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        On Error Resume Next
        CV1 = ListView3.SelectedItems(0).Index - 1
        On Error Resume Next
        CVor1 = ListView3.Items(CV1).Text
        On Error Resume Next
        CN1 = ListView3.SelectedItems(0).Index + 1
        On Error Resume Next
        CNach1 = ListView3.Items(CN1).Text
        On Error Resume Next
        CV2 = ListView3.SelectedItems(0).Index - 2
        On Error Resume Next
        CVor2 = ListView3.Items(CV2).Text
        On Error Resume Next
        CN2 = ListView3.SelectedItems(0).Index + 2
        On Error Resume Next
        Cnach2 = ListView3.Items(CN2).Text

        If IstJetztBlock = True Then ' Neue Sendernummer ist jetzt Teil eines Blocks

        If WasBlock = True Then
        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        ListView3.Select()
        ListView3.SelectedItems(0).EnsureVisible()


        Exit Sub
        End If

        For i = DE To ListView3.Items.Count - 1
        DEintrag = ListView3.Items(i).SubItems(0).Text
        DEintrag = DEintrag - 1
        NullGen(DEintrag)
        ListView3.Items(i).SubItems(0).Text = DEintrag
        Next

        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        ListView3.Select()
        ListView3.SelectedItems(0).EnsureVisible()

        Exit Sub

        End If

        If DEintrag = CVor1 And Not DEintrag = Cnach2 Then ' Neue Sendernummer ist nicht Teil eines Blocks

        If WasBlock = True Then ' Kommt der Sender aus einem Block ?

        If ListView3.SelectedItems(0).Text = ListView3.Items(CV1).Text Then 'Prüfen ob Durchnummerierung geändertwerden soll
        'DEintrag = DEintrag - 1
        'NullGen(DEintrag)
        'ListView3.SelectedItems(0).Text = DEintrag
        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        For i = CN1 - 1 To ListView3.Items.Count - 1
        DEintrag = ListView3.Items(i).SubItems(0).Text
        DEintrag = DEintrag + 1
        NullGen(DEintrag)
        ListView3.Items(i).SubItems(0).Text = DEintrag

        Next
        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        ListView3.Select()
        ListView3.SelectedItems(0).EnsureVisible()

        Exit Sub

        End If

        Else

        DEintrag = ListView3.Items(CV1).SubItems(0).Text
        DEintrag = DEintrag - 1
        NullGen(DEintrag)
        ListView3.Items(CV1).SubItems(0).Text = DEintrag

        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        ListView3.Select()
        ListView3.SelectedItems(0).EnsureVisible()

        Exit Sub

        End If

        DEintrag = ListView3.Items(CV1).SubItems(0).Text
        DEintrag = DEintrag - 1
        NullGen(DEintrag)
        ListView3.Items(CN1).SubItems(0).Text = DEintrag

        ListView3.Sorting = SortOrder.None
        ListView3.Sorting = SortOrder.Ascending
        ListView3.Select()
        ListView3.SelectedItems(0).EnsureVisible()

        Exit Sub

        End If


        If Not DEintrag = CVor1 Then ' Neue Sendernummer kommt nur einmal vor
        ListView3.Select()
        ListView3.SelectedItems(0).EnsureVisible()

        Exit Sub

        End If[/highlight]

        Das Problem ist, ich habe keinen anderen Weg gefunden aus diesen hier, Hintergrund des ganzen ist: Es müssen Kanäle sortiert werden, in der ersten Spalte steht die Kanal Nummer, anhand dieser wird sortiert. Z.B.: Wenn der User auf einen Button klickt, dann soll ein Eintrag nach oben oder unten verschoben werden. Das Problem bei der ganzen Sache ist das es möglich sein muss das Kanalnummer mehrfach (Also als Block) vorkommen z.B.:

        0001
        0002
        0003
        0004
        0004
        0004
        0005
        0006
        0007
        0007
        0007
        0008
        0009

        Deswegen muss die Listview auch erkennen können wo der entsprechende Eintrag hin muss, ist also leider nicht einfach mal schnell über den Index zu sortieren, des weiteren muss die Tabelle erkennen ob ein Kanal Platz frei ist oder nicht oder ob der Kanalplatz von einen Block in einen Block geschoben wird oder aus einem herrauskommt etc. etc.

        Dadurch das ich der Tabelle mehrmals sagen muss das Sie sich sortieren soll, dauert dies natürlich etwas... Wenn diese Sub 50 mal ausgeführt wird, weil der User ein Kanal um 50 Plätze verschieben will, dann dauert das ganz schön lange.

        Comment


        • #5
          Mit visible und enabled bringt das nicht. Am Anfang einmal ein ListView3.BeginUpdate() machen und wenn man fertig ist, ein ListView3.EndUpdate().

          bye,
          Helmut

          Comment


          • #6
            Hy Helmut,

            Danke für deinen Tipp, aber das hilft leider nicht. Ich denke das die Sorting Anweisung das ganze verursacht (neues Zeichnen der ListView), habe es auch schon bereits mit .SuspendLayout /.ResumeLayout und mit
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) leider hilft dies auch nicht, Hat noch jemand ne Idee ?

            Comment


            • #7
              Okay, nach langem hin und her habe ich es nun doch hinbekommen, das Problem lag wohl daran das er mit:

              [highlight=vbnet]ListView3.Sorting = SortOrder.None
              ListView3.Sorting = SortOrder.Ascending[/highlight]

              egal was man Ihm sagt das Listview Steuerelement neu gezeichnet hat, was man Ihm nicht ausprügeln kann. Habe also stattdesssen die Logik der Funktion leicht umgebaut und lasse jetzt die Listview mit:

              [highlight=vbnet]Public Class ffListView
              Inherits ListView

              Public Sub New()
              Me.DoubleBuffered = True
              End Sub
              End Class
              Public Class ListviewComparer
              Implements IComparer
              Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
              If Integer.TryParse(CType(x, ListViewItem).Text, New Integer) = False Then
              Return 1
              ElseIf Integer.TryParse(CType(y, ListViewItem).Text, New Integer) = False Then
              Return 1
              End If
              If Integer.Parse(CType(x, ListViewItem).Text) > Integer.Parse(CType(y, ListViewItem).Text) Then
              Return 1
              ElseIf Integer.Parse(CType(x, ListViewItem).Text) = Integer.Parse(CType(y, ListViewItem).Text) Then
              Return 0
              ElseIf Integer.Parse(CType(x, ListViewItem).Text) < Integer.Parse(CType(y, ListViewItem).Text) Then
              Return -1
              End If
              End Function
              End Class[/highlight]

              sortieren welche ich mit:


              [highlight=vbnet]ListView3.ListViewItemSorter = New ListviewComparer[/highlight]

              aufrufe, das ergebniss, die Listview wird hierdurch nicht neu gezeichnet und es passiert kein Flackern mehr.

              Schreibe es deswegen noch mit rein falls es jemanden gibt der auch seine Listview sortiert haben möchte und dieses flacker Problem hat, hiermit funktioniert überings auch ein Nummerische Sortierung im Gegensatz zur AlphaNummerischen Sortierung also keine Ausgabe von:

              1
              10
              11
              12
              2
              20
              21

              sondern:
              1
              2
              3
              ...
              10
              11

              Dank Dir Helmut trotzdem für deine Hilfe !

              Greetz CR


              P.s.: Vielleicht kann ja einer der Mods den Thread Titel ändern, nach Listview Sortieren, könnte für den einen oder anderen hilfreich sein !

              Comment

              Working...
              X