Drei letzte Problemchen: Nach TreeView.afterlabeledit die TRV neu aufbauen lassen, Combobox Hintergrundfarbe und SuspendLayout in Datagrid...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Drei letzte Problemchen: Nach TreeView.afterlabeledit die TRV neu aufbauen lassen, Combobox Hintergrundfarbe und SuspendLayout in Datagrid...

    Hi Ihr,

    mein Proggi steht und läuft auch dank Eurer Hilfe inzwischen wunderbärchen.

    Nur drei Probleme nagen noch an dem Eigenstolz:

    1. Wenn ich in meiner TreeView mit Inhalt Ordnerstruktur z.B. im afterlabeledit :

    VB.NET-Quellcode

    1. Private Sub Trv_Folders_AfterLabelEdit(sender As Object, e As NodeLabelEditEventArgs) Handles trv_Folders.AfterLabelEdit
    2. If IsDBNull(e.Label) <> True AndAlso e.Label IsNot Nothing AndAlso e.Label <> "" AndAlso e.Label.ToLower <> letzterOrdnerAusPfad(OrdnerPfad).ToLower Then
    3. If Not CheckFoldername(e.Label) Then
    4. Dim form_fehler As New ICE_Eingabe
    5. form_fehler.Initialisiere(False, "ICE-Fehler!", "Unzulässige(s) Zeichen im Ordnernamen!" & vbCrLf & vbCrLf & Chr(34) & e.Label & Chr(34), MessageBoxButtons.OK, 8)
    6. trv_Folders.SelectedNode.Text = oldFolderName
    7. e.Node.BeginEdit()
    8. Else
    9. If IO.Directory.Exists(IO.Path.Combine(PfadOhneOrdnerpfad(OrdnerPfad), e.Label)) = True Then
    10. Dim form_fehler As New ICE_Eingabe
    11. form_fehler.Initialisiere(False, "ICE-Fehler!", "Der Ordner:" & vbCrLf & vbCrLf & Chr(34) & e.Label & Chr(34) & vbCrLf & vbCrLf & "existiert bereits in:" & vbCrLf & vbCrLf & OrdnerPfad, MessageBoxButtons.OK, 8)
    12. trv_Folders.SelectedNode.Text = oldFolderName
    13. e.Node.BeginEdit()
    14. Else
    15. Try
    16. e.Node.EndEdit(False)
    17. If doFullOrdnerRename(OrdnerPfad, e.Label) = True Then
    18. Dim parentPfad = IO.Directory.GetParent(OrdnerPfad)
    19. OrdnerPfad = IO.Path.Combine(parentPfad.FullName, e.Label)
    20. trv_Folders.SelectedNode.Text = e.Label
    21. inEditListe = False
    22. e.CancelEdit = True
    23. End If
    24. Catch ex As System.Exception
    25. Dim form_exclamation As New ICE_Eingabe
    26. form_exclamation.Initialisiere(False, "ICE-Fehler!", "Der Ordner:" & vbCrLf & vbCrLf & Chr(34) & letzterOrdnerAusPfad(OrdnerPfad) & Chr(34) & vbCrLf & vbCrLf & "kann nicht in:" & vbCrLf & vbCrLf & Chr(34) & e.Label & Chr(34) & vbCrLf & vbCrLf & "umbenannt werden!" & vbCrLf & vbCrLf & "Grund: " & ex.Message, MessageBoxButtons.OK, 4)
    27. trv_Folders.SelectedNode.Text = e.Label
    28. e.Node.BeginEdit()
    29. End Try
    30. End If
    31. End If
    32. Else
    33. If trv_Folders.SelectedNode IsNot Nothing Then
    34. trv_Folders.SelectedNode.Text = oldFolderName
    35. End If
    36. e.CancelEdit = True
    37. End If
    38. FileWatcherSwitch(True)
    39. End Sub


    nach dem Reaktivieren des FSW in der letzten Zeile die Sub "CreateTRVFolders" zum Neueinlesen der TRV-Ordnerstruktur (wegen der Sortierung nach Umbenennen oder Neuanlegen eines Knotens) einfüge, erhalte ich einen Fehler.
    Wohl, weil ich damit noch in der afterlabelEdit drin bin.
    Wie kann ich aber dann nach dem erfolgreichen AfterLabelEdit meine TRV neu einlesen lassen?

    2. Ich habe ja ein Dark-Theme, in welchem die Hintergrundfarben (fast) aller Controls dunkel gefärbt werden. Ausnahme DateTimePicker - die ignorieren die Zuweisung der Hintergrundfarbe.
    Bei der Combobox gelingt mir das Setzen der Hintergrundfarbe nur, wenn ich deren DropDownStyle auf DropDown stelle. Bei DropDownList ignoriert die Combobox die Hintergrundfarbzuweisung.
    Dummerweise heisst DropDown aber, dass der Anwender Text in die Combo eingeben kann - was ich aber nicht will.
    Also sperre ich mit:

    VB.NET-Quellcode

    1. Private Sub Mnu_TextEditor_cob_TextEncoding_KeyDown(sender As Object, e As KeyEventArgs) Handles mnu_TextEditor_cob_TextEncoding.KeyDown, sym_TextEditor_Format_cob_Schriftart.KeyDown, sym_TextEditor_Format_cob_Schriftgrösse.KeyDown
    2. Select Case e.KeyCode
    3. Case Keys.Down, Keys.Up
    4. Case Else
    5. e.SuppressKeyPress = True
    6. End Select
    7. End Sub

    alle Eingaben ausser CursorUp/Down und Enter.

    Nur... So werden die Textinhalte der Combos selektiert, da diesem Combobox-Text ja ein existierender Combobox-Listen-Eintrag entspricht, was ich aber auch nicht will.
    Kann ich diese Selektion irgendwie unterdrücken?

    3. Ich befülle meine Datagridviews in einer Schleife mit:

    VB.NET-Quellcode

    1. Dim icon As Icon = Icon.ExtractAssociatedIcon(fInfo.FullName)
    2. If oDateiart > 8 Then
    3. icon = My.Resources.Schlüssel
    4. End If
    5. If icon IsNot Nothing Then
    6. resizedIcon = MainForm.ResizeIcon(icon, CInt(dgv_Suchergebnisse.Font.Size + 10), CInt(dgv_Suchergebnisse.Font.Size + 10))
    7. End If
    8. fileDetail = My.Computer.FileSystem.GetFileInfo(fInfo.FullName)
    9. dgv_Suchergebnisse.Rows.Add(resizedIcon,
    10. IO.Path.GetFileName(fInfo.FullName),
    11. MainForm.OrdnerPfadOhneArchiv(MainForm.aktivesArchivPfad, IO.Path.GetDirectoryName(fInfo.FullName)),
    12. MainForm.DateiEndungTypBezeichnung(LCase(IO.Path.GetExtension(fInfo.FullName))),
    13. fileDetail.LastWriteTime,
    14. fileDetail.LastAccessTime,
    15. fileDetail.CreationTime)


    Vor der Schleife habe ich dgv_suchergebnisse.suspendlayout und nach der Schleife dgv_suchergebnisse.resumelayout
    Das funktioniert aber nur, wenn ich auf das Icon in Spalte 1 verzichte.

    VB.NET-Quellcode

    1. fileDetail = My.Computer.FileSystem.GetFileInfo(fInfo.FullName)
    2. dgv_Suchergebnisse.Rows.Add(IO.Path.GetFileName(fInfo.FullName),
    3. MainForm.OrdnerPfadOhneArchiv(MainForm.aktivesArchivPfad, IO.Path.GetDirectoryName(fInfo.FullName)),
    4. MainForm.DateiEndungTypBezeichnung(LCase(IO.Path.GetExtension(fInfo.FullName))),
    5. fileDetail.LastWriteTime,
    6. fileDetail.LastAccessTime,
    7. fileDetail.CreationTime)

    Dann werden die Inhalte der DGV erst angezeigt, wenn die Schleife komplett abgearbeitet ist.

    Mit eingefügtem Icon wird aber trotz SuspendLayout die DGV sichtbar Zeile für Zeile aufgebaut und aktualisiert.

    Kann ich das irgendwie mit dem Einbinden der Icons in Spalte 1 so hinbekommen, dass die DGV erst nach Durchlauf der Schleife aufgebaut wird?
    Ich verspreche mir davon eine schnellere Abarbeitung der Schleife.

    Wäre toll, wenn Ihr mir hier helfen könntet.
    Dann wäre ich rundum happy mit meinem ersten VB.Net-Proggi.

    Beste Grüsse
    Punkt 1:
    Vielleicht hilft mein bei mir beliebter Delay-Workaround. Also am Ende die Delay-Zeile rein und dann CreateTRVFolders. Aber das ist Spekulatius.

    Punkt 2:
    Was willst Du denn überhaupt mit der ComboBox, wenn nix selektiert werden soll? Welches Zweck soll die ComboBox erfüllen?

    Punkt 3 kann ich bisher nicht bestätigen.
    Ich habe in einem Testprogramm ein DGV mit ImageColumn und TextBoxColumn und das hier:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. DataGridView1.SuspendLayout()
    3. For i = 1 To 10
    4. DataGridView1.Rows.Add(Icon.ExtractAssociatedIcon(HierDerPfadZuEinerDateiMitSymbol), "Foo")
    5. Threading.Thread.Sleep(200)
    6. Next
    7. DataGridView1.ResumeLayout()
    8. End Sub

    Das wird ohne Inhaltsanzeige befüllt, bis es fertig ist.

    btw: Ich kenn Dein Programm nicht, aber DataBinding kommt nicht infrage?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Hi Vaporized,

    besten Dank für Deinen Beitrag.

    Delay versagt - das hatte ich schon versucht - solange die Abarbeitung im AfterLabelEdit steckt, kann (m.E. logischerweise) die übergeordnete TRV nicht geleert und neu befüllt werden.
    EDIT:
    Mein Delay:

    VB.NET-Quellcode

    1. Public Sub Delay(nSekunden As Long)
    2. Dim TimeOut As Long
    3. TimeOut = CInt((GetTickCount / 1000) + nSekunden)
    4. Do
    5. System.Windows.Forms.Application.DoEvents()
    6. Loop Until TimeOut < (GetTickCount / 1000)
    7. End Sub


    Wie machen das die anderen Coder mit dem Neuaufbau der TRV nach umbenennen / neu Anlegen von Knoten?
    Es wird ja in jedem Proggi nach dem Umbenennen oder neuhinzufügen von Knoten die TRV neu aufgebaut.
    Als eine vielleicht funktionierende Hilfslösung (durch die Brust ins Auge) fällt mir nur ein, eine Boolsche Variable TRVMussNeuEingelesenWerden in diesem AfterLabelEdit auf true zu setzen und dann im Global Timer:

    VB.NET-Quellcode

    1. if TRVMussNeuEingelesenWerden = true then
    2. TRVMussNeuEingelesenWerden = false
    3. CreateTRVFolders
    4. endif

    Dann wäre ich aus der AfterLabelEdir raus und die CreateTRVFolders würde erst im GlobalTimer ausgeführt.
    Aber unter sauberer Programmierung stelle ich mir was anderes vor...

    Zu 2.
    Da habe ich mich vielleicht unverständlich ausgedrückt.
    Ich habe z.B. Combos Schriftart (Liste aller Schriftarten) und Schriftgrösse (Liste aller Schriftgrössen), welche der User auch benutzen und sich den gewünschten EIntrag auswählen kann.
    Nur soll er halt nichts reinschreiben bzw. editieren können wie bei DropDownStyle = DropDown, sondern nur aus der Liste auswählen wie bei DropDownstyle = DropDownlist.
    Da DropDownStyle = DropDownList aber kein Setting der Hintergrundfarbe annimmt, muss ich DropDownStyle = DropDown verwenden und Texteingaben darin abfangen und unterdrücken.
    Der blöde Nebeneffekt bei DropDownStyle = DropDown ist aber, wenn die Eigenschaft .Text in der Auflistung enthalten ist, wird der Inhalt des Textfelds selektiert (also gebläut).
    Das will ich aber eben nicht haben - der Text soll umnmarkiert angezeigt werden - wie bei DropDownstyle = DropDownlist.
    Dafür finde ich aber keine Lösung.

    Zu 3.
    Ups...
    Das Icon-Setzen ist unschuldig - schuld hat:

    VB.NET-Quellcode

    1. Application.DoEvents()

    in der Schleife.
    Aber das brauche ich doch, um die "Anwendung reagiert nicht mehr" (oder so ähnlich) -Meldung bei Schleifendurchlaufzeit > 1min zu verhindern.
    Wie machst Du das bei Deiner Schleife?
    Habe eben festgestellt, dass das SuspendLayout gar keinen Zeitgewinn bringt.
    Mit tatsächlich unterdrücktem Aufbau ohne DoEvents 22.5sec mit sichbarem Zeilenaufbau mit DoEvents 22.5sec.
    Dann kann ich die DGV auch gleich sichbar aufbauen lassen.
    Dann können die User wenigstens sobald der gewünschte Eintrag gelistet wird, diesen anklickern und weiterarbeiten.

    EDIT2:
    Datenbindung habe ich in meiner Objektliste - nicht aber in dieser Suchergebnisliste, die ja bei jedem Suchauftrag temporär neu aufgebaut wird.
    Das erschien mir dann doch unnötig.
    Oder gibt es gewichtige Gründe, welche auch hier für ein Bindung sprechen?


    Beste Grüsse

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