Layout und Controls und ReBuild

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

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    ​Antworten krieg ich ja nich
    ????? Ich schreib doch ständig..

    Ich habe vor Monaten mal gegoogle nach Programmen zum "Umbenennen von Dateien" Da kamen die üblichen verdächtigen, Chip, Bild usw....
    Habe mir einige angesehen 2 oder 3 auch mal ausprobiert. Sagte mir alles nicht zu.
    Entweder viel zu unübersichtlich, weil mit soviel ( für mich nicht brauchbaren ) ausgestattet.. oder sie funktionierten nicht weil ich erst wieder auf Win10 oder etliche FWs downloaden sollte.
    Einiges war "Free/ShareWare" oder eben nur Testprogramme, wo ich dann max 3-xx Dateien umbenennen konnte usw...
    Im Endeffekt halt nichts was ich für mich brauchen konnte.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Haudruferzappeltnoch: Was ist für Dich unbeantwortet? Welche verfügbaren Programme Amelie schon genutzt hat oder wie ihre Benennungsstrategie ist, wenn mehrere Dateien den gleichen Namen haben?
    btw: Meine Programme erzeugen auch manchmal Dateien und da müssen Namen vergeben. Und da ich damit rechnen muss, dass das Programm ggf. schon eine Datei mit gleichem Namen erzeugt hat, verwende ich einfachen brute-force-Code:

    Quellcode

    1. TatsächlicherName = Wunschname
    2. Wenn TatsächlicherName als Dateiname noch nicht existiert, dann ok
    3. Sonst
    4. Zählindex = 0
    5. Erhöhe solange Zählindex, bis "TatsächlicherName (Zählindex)" noch nicht vergeben ist


    @Amelie: Haudruferzappeltnoch hat ja auch nen Controlvorschlag in Post#18 gemacht.
    Ich hätte aber nochmal einen, eher einfachen:
    Eine ListBox, in der die Dateitypen drinstehen, und eine CheckedListBox, in der die entsprechenden Endungen drinstehen.
    Bilder
    • simpel.png

      1,81 kB, 272×123, 673 mal angesehen
    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.
    Damit noch ein paar Antworten kommen.

    Auf die Frage was hätte ich ohne so ein Programm gemacht.
    Naja z.B. jedes Bild vom Urlaub, in einem Programm geöffnet das mir das Aufnahmedatum anzeigt, es wieder geschlossen und dann von Hand umbenannt.
    Das ganze dann mit jedem Bild, ach und natürlich auch mit jedem Video.
    Wenn dann bei einer Kamera oder Handy nicht die richtige Uhzeit oder Datum eingestellt ist, addiere ich jedem Datum dann noch was von Hand dazu bevor ich es umbenenne.

    Vor einigen Jahren habe ich das Programm "NameExif" benutz um Bilder nach Datum und Uhrzeit umzubenennen.(ist kein kommerzielles Programm)
    Damals gingen allerdings Videos noch nicht und mir hat auch die Vorschau auf die neuen Namen gefehlt.
    Und Vorschau von den Bildern und Videos gingen natürlich auch nicht.

    Hatte vorher auch noch andere Programme angeschaut, aber auch mir haben die bisher nicht so zugesagt.

    Wenn im DGV das mit den Farben auch geht wäre das auch eine Möglichkeit. (aktuell habe ich die ListView und es geht wie gewünscht)

    Warum einen Falschen Dateinamen Rot anzeigen, die Kamera machen da keinen Fehler, aber der Anwender kann in der Textbox z.B. ein ? oder Eckige Klammern etc. eingeben.
    Klar könnte ich das auch in der Textbox raus Filtern, da ich aber z.B. die Eckigen Klammern in der TextBox für "Standard Elemente" wie Datum oder Uhzeit etc. verwende, die dann ersetzt werden,
    wäre das auch keine Lösung.
    Daher Prüfe ich den Dateinamen vor der Ausgabe und färbe ihn dann in der Liste. (in der Textbox in welcher der User es eingibt wird es auch noch angezeigt)

    Es ist auch möglich andere Dateien umzubenennen, aber das kommt bei aber eigentlich so gut wie vor.
    @VaporiZed

    ​Eine ListBox, in der die Dateitypen drinstehen, und eine CheckedListBox, in der die entsprechenden Endungen drinstehen.


    Dann musste sich aber der Inhalt der CheckedListbox mit den Dateiendungen automatisch ändern je nach dem was in den typen drin steht...
    Mal überlegen wie ich das machen könnte... und wie ich das dann mit dem "Layout" umsetze. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Stichwort DataBinding. Wenn Du eine Datenliste mit Objekten vom Typ X hast, wobei X aus einem String (Kategorienamen) und eine List(Of String) für die Endungen besteht, kannst Du mittels DataBinding bzw. BindingSource die Titel aller X-Instanzen in der ListBox und die Endungen in der CheckedListBox anzeigen lassen. Die Anzeigeumschaltung erfolgt so automatisch. Die Auswahl der gewünschten Dateiendungen ginge ggf. auch mit DataBinding. Versuch es an einem Testprojekt, bevor Du Dir Dein jetziges verunstaltest.

    ##########

    Da die CheckedListBox aber DataBinding und Item-Selection nicht so leicht vereinbar macht, kannst Du auch alternativ zur CheckedListBox ein DGV nehmen, dass Du dann designtechnisch ähnlich gestaltest. Damit geht es dann mit DataBinding sehr leicht.
    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“ ()

    @VaporiZed Ich muss gestehen, ich sehe nicht eine Frage als hinreichend beantwortet an bis Post 24

    Danke @SoEinVBler
    Das geht also doch in Richtung automatisierte Umbenennung. Das heißt aber gleichzeitig, wenn du nicht selber tippen willst, dann braucht man keine Auflistung/Anzeige der Dateien. Selbes Prinzip bei "NameExif", warum braucht man denn eine Vorschau der automatisierten Umbenennung? Entweder die Automatisierung funktioniert oder sie tut es nicht, kann das so krass schiefgehen, dass das überwacht werden muss?
    Ok rot für Userinput, da komm ich mit.
    Kann man im Explorer nicht das Erstelldatum sehen? Also deswegen muss die Datei doch nicht so heißen. Ja ok falsche Handyzeit, das wäre nicht abgedeckt, aber kann man an diesen Geräten nicht die Uhrzeit einstellen?
    Wenn das so ein großes Problem ist, dass ein Programm das ausbaden muss, dann kann man das auch kaum vergessen.

    Und das mit der Anzeige ist hochrelevant, brauch ich nämlich keine Anzeige muss ich auch keine Filter auswählen. Übrigens auch eine weiterhin unbeantwortete Frage. Mir ist immer noch nicht klar, ob das überhaupt zum Filtern sein soll. So wie wir es in Post 18 und Post 23 annehmen.
    @VaporiZed

    Ich hatte noch eine Idee mit dem "Treeview" aber das ist auch nicht das Gelbe vom Ei. :)
    Habe dann mal das mit den beiden Boxen gemacht.

    Hierzu gleich mal eine Frage: Wie bekomme ich die beiden auf gleiche Höhe? Habe so ziemlich alles Versucht... ?(
    Ob mir das vom Design her besser gefällt weiß ich noch nicht. Aber für andere Sachen, finde ich das schon cool. 8o

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Public Class Form1
    3. Private xmlDoc As New XmlDocument()
    4. Public Sub New()
    5. InitializeComponent()
    6. End Sub
    7. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. xmlDoc.Load("A:\TestUmgebung\Extensions.xml")
    9. LoadTreeView(xmlDoc)
    10. LoadListBox(xmlDoc)
    11. End Sub
    12. Private Sub LoadTreeView(xmlDoc As XmlDocument)
    13. TreeView1.Nodes.Clear()
    14. For Each groupNode As XmlNode In xmlDoc.SelectNodes("/FileExtensionDictionary/FileExtensionGroups/Group")
    15. Dim groupName As String = groupNode.Attributes("Name").Value
    16. Dim groupTreeNode As TreeNode = New TreeNode(groupName)
    17. For Each extensionNode As XmlNode In groupNode.SelectNodes("Extensions/Extension")
    18. groupTreeNode.Nodes.Add(extensionNode.InnerText)
    19. Next
    20. TreeView1.Nodes.Add(groupTreeNode)
    21. Next
    22. End Sub
    23. Private Sub LoadListBox(xmlDoc As XmlDocument)
    24. For Each groupNode As XmlNode In xmlDoc.SelectNodes("/FileExtensionDictionary/FileExtensionGroups/Group")
    25. Dim groupName As String = groupNode.Attributes("Name").Value
    26. ListBoxGroups.Items.Add(groupName)
    27. Next
    28. End Sub
    29. Private Sub ListBoxGroups_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBoxGroups.SelectedIndexChanged
    30. CheckedListBoxExtensions.Items.Clear()
    31. If ListBoxGroups.SelectedIndex >= 0 Then
    32. Dim selectedGroup As String = ListBoxGroups.SelectedItem.ToString()
    33. Dim groupNode As XmlNode = xmlDoc.SelectSingleNode("/FileExtensionDictionary/FileExtensionGroups/Group[@Name='" & selectedGroup & "']")
    34. For Each extensionNode As XmlNode In groupNode.SelectNodes("Extensions/Extension")
    35. Dim extension As String = extensionNode.InnerText
    36. CheckedListBoxExtensions.Items.Add(extension)
    37. Next
    38. End If
    39. End Sub
    40. End Class




    @Haudruferzappeltnoch

    ​überhaupt zum Filtern sein soll

    Bei mir soll das zum Filtern der DateiTypen sein. Es kann vorkommen, das ich einen Stick bekomme auf dem alles wild durcheinander ist. Da kann ich mir das dann sukzessive schnell umbenennen.
    Bilder
    • test-1.jpg

      62,41 kB, 416×238, 69 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Wie bekomme ich die beiden auf gleiche Höhe? Habe so ziemlich alles Versucht...
    Anscheinend nicht. Die ListBox fängt bei Standardeinstellungen bei Höhe 17 an und erhöht sich pro Zeile um 13. Die CheckedListBox startet bei 19 und wird um 15 erhöht. Beide haben daher eine gemeinsame Höhe bei 394 Pixel. Aber das wäre :thumbdown:
    Beide Boxen haben aber die Property IntegralHeight, die Du auf False setzen kannst. Danach kannst Du beide Boxen fließend höhentechnisch einstellen. Oder nur eine und an die andere anpassen.
    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.
    @VaporiZed

    Also das mit der gleichen "höhe" klappt ja.
    Frage dazu: Woher bekommt man solche Infos?

    OK dann habe ich nochmal mit einem DGV versucht.
    2 Probleme. Ich bekomme das mit den Checkboxen nicht hin und vom Layout.. je mehr Gruppen hinzukommen, desto breiter wird das ganze. Also auch Suboptimal.
    Aber trotzdem eine gute Übung mit dem DGV. ;)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub LoadDataGridView(xmlDoc As XmlDocument)
    2. dgvXML.Rows.Clear()
    3. For Each groupNode As XmlNode In xmlDoc.SelectNodes("/FileExtensionDictionary/FileExtensionGroups/Group")
    4. Dim groupName As String = groupNode.Attributes("Name").Value
    5. dgvXML.Columns.Add(groupName, groupName)
    6. Next
    7. For Each groupNode As XmlNode In xmlDoc.SelectNodes("/FileExtensionDictionary/FileExtensionGroups/Group")
    8. Dim groupName As String = groupNode.Attributes("Name").Value
    9. For Each extensionNode As XmlNode In groupNode.SelectNodes("Extensions/Extension")
    10. Dim extension As String = extensionNode.InnerText
    11. Dim rowIndex As Integer = dgvXML.Rows.Add()
    12. dgvXML.Rows(rowIndex).HeaderCell.Value = extension
    13. Dim groupColumnIndex As Integer = dgvXML.Columns(groupName).Index
    14. If groupColumnIndex >= 0 Then
    15. dgvXML(groupColumnIndex, rowIndex).Value = False
    16. End If
    17. Next
    18. Next
    19. End Sub

    Bilder
    • test-2.jpg

      97,82 kB, 525×407, 55 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Woher bekommt man solche Infos?
    Das mit der Höhenunterschieden und der Berechnung? Ausprobieren. Ist ja auch abhängig von der Schriftart, Schriftgröße usw. ListBox und CheckedListBox je so klein machen, dass kein Item angezeigt wird, Höhe anschauen (je 4), Höhe so ändern, dass je ein Item angezeigt wird, Höhe anschauen (ListBox 17, Höhendifferenz zu 0 Items also 13; CheckedListBox 19, Höhendifferenz zu 0 Items also 15). Dann bekommst Du die Formel: 13x = 15y. Tja, und der Rest ist … Ausprobieren oder ein Programm dafür schreiben ;)
    IntegralHeight: Musste ich ein bisschen im Netz recherchieren, um auf den Begriff zu kommen. Hatte mir damals ein eigenes DGV basteln wollen, was sowas auch kann. Aber für dieses Sowas brauchte ich ein Begriff. Und den hatte ich damals gesucht und gefunden.

    Das mit der DGV-Nutzung ist nicht wie von mir gedacht. Du solltest nicht alle Dateiendungen anzeigen lassen, sondern in einer ListBox die Kategorien und im DGV die passenden Dateiendungen. Und die erste Spalte sollte eine CheckBoxColumn sein, keine TextBoxColumn.
    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 2 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed

    ​Das mit der DGV-Nutzung ist nicht wie von mir gedacht.

    Habe ich dann falsch verstanden.

    Jetzt habe ich eine Mischung aus "Listbox und Listview" gemacht. Siehe Bild.
    Gefällt mir vom Layout und der Übersicht schon besser, obwohl es eine Tüftelei ist die passende "Breite" für das Listview zu ermitteln.
    Bilder
    • test-3.jpg

      60,66 kB, 545×275, 53 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Die ListView hat mir optisch in früheren Windows Versionen auch immer besser gefallen. Hierzu ein kleiner Tipp du kannst auf die ListView den Explorerstyle anwenden damit sieht das Ding noch ansprechender aus.
    Spoiler anzeigen

    C#-Quellcode

    1. internal static class NativeMethods
    2. {
    3. [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    4. public static extern int SetWindowTheme(IntPtr p, string str0, string str1=null);
    5. }
    6. /*
    7. Friend Module NativeMethods
    8. <DllImport("uxtheme.dll", CharSet:=CharSet.Unicode)>
    9. Function SetWindowTheme(ByVal p As IntPtr, ByVal str0 As String, ByVal Optional str1 As String = Nothing) As Integer
    10. End Module
    11. */

    Aufgerufen wird das ganze dann mit NativeMethods.SetWindowTheme(DeineListView.Handle, "explorer");


    Zu deiner eigentliche Frage, falls ich dich richtig verstanden habe sollen egal bei welcher Breite immer die selbe Anzahl an Items pro Reihe angezeigt werden?
    Einstellen kann man das leider nicht aber es gibt einen Workaround mittels einer ImageList.
    D.H. weise deiner ListView eine ImageList zu und aboniere den Form_Resize Event.
    Das gezeigte Beispiel zeigt bis zu einer Bestimmten Größe immer 3 Items pro Zeile an.

    C#-Quellcode

    1. private void Form1_Resize(object sender, EventArgs e)
    2. {
    3. int minWidth = DeineListView.Width - 140; // -140 fürs padding
    4. int iconWidth = (int)Math.Round(minWidth / 3d, MidpointRounding.ToEven);
    5. iconWidth = Math.Min(iconWidth, 256); // Maximale Breite für die ImageList.Images ist 256
    6. ImageList_ListViewIcons.ImageSize = new Size(iconWidth, ImageList_ListViewIcons.ImageSize.Height);
    7. }
    Bilder
    • Screenshot 2023-09-12 112404.png

      12,15 kB, 1.777×482, 50 mal angesehen
    Das sollte nur zeigen das es 3 Items in einer Zeile sind.

    *Edit*
    Hab mal 2 Bilder angehängt die den Unterschied zwischen dem Explorer-Style und den WinForms-Style zeigen. Eines ist von Win7 und das andere von Win11.
    Bilder
    • win7-example.png

      9,08 kB, 798×480, 55 mal angesehen
    • win11-example.png

      12,97 kB, 798×480, 67 mal angesehen

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