Alle PDF aus ordner in DataGridVew anzeigen lassen mit Checkboxen und ComboBoxen als weitere Columns

  • C#
  • .NET 5–6

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

    Alle PDF aus ordner in DataGridVew anzeigen lassen mit Checkboxen und ComboBoxen als weitere Columns

    Hallo zusammen,

    lange ist es her, als ich hier zuletzt geschrieben habe.

    Nun komme ich mein einem kleinen Verständnisproblem mit C# und DataGridView daher.

    Mein Vorhaben:

    Ich möchte alle .pdf Dateien aus einem _Scann Ordner auslesen und in ein DGV schieben.
    Dies sollte dan ca. so aussehen:
    Dateinamecheckbox
    ComboBox
    ComboBox
    Textbox


    Den Inhalt der ComboBoxen möchte ich aus einem enum haben, (enum docType & docCategorie)

    Ich bekomme es allerdings nicht hin, die Rows der DGV zu befüllen, mit den Comboboxen.
    Hat da jemand eine Idee oder Vorschlag wie ich das sauber machen sollte?

    Dateien lese ich wie folgt in ein Array:

    Quellcode

    1. string[] filePaths = Directory.GetFiles(@"C:\Users\xyz\Nextcloud\Fam\_Scan\", "*.pdf",
    2. SearchOption.AllDirectories);


    Mein Gedanke war nun, über das Array zu Loopen und bei jedem Eintrag eine Row zu adden. Doch da hapert es dann mit den comboboxen.

    Beste Grüsse

    .Scare schrieb:

    Ich möchte alle .pdf Dateien aus einem _Scann Ordner auslesen und in ein DGV schieben.
    nein, du möchtest keine pdf-Dateien in ein DGV schieben - das geht nämlich garnet.
    Du möchtest Datensätze in ein DGV schieben.
    Anscheinend Datensätze mit 5 Properties - daraus ergeben sich ja die Spalten im DGV.
    Von der ersten Property weiss ich schon Name und Datentyp, nämlich 'DateiName' und 'String'.
    Von der zweiten Property weiss ich nur den Datentyp: Boolean - ich denke ja nicht, die Property soll 'Checkbox' heissen.
    Von den anderen drei Properties weiss ich noch weniger.

    Ich denke, du kommst voran, wenn du diesbezüglich Licht ins Dunkel bringst: Also welche Properties (Name+Typ) sollen deine Datensätze haben?

    ErfinderDesRades schrieb:

    Du möchtest Datensätze in ein DGV schieben.

    Da hast du recht. =)

    ErfinderDesRades schrieb:

    Anscheinend Datensätze mit 5 Properties - daraus ergeben sich ja die Spalten im DGV.

    Auch richtig, jedoch gibt es noch einen ,den man nicht im DGV sehen sollte (FilePath = String)

    ErfinderDesRades schrieb:

    Ich denke, du kommst voran, wenn du diesbezüglich Licht ins Dunkel bringst: Also welche Properties (Name+Typ) sollen deine Datensätze haben?

    Das würde so aussehen:
    FilePath*StringAbsoluter Path, *Hidden
    FileNameStringName des Files
    FileDateString, Int oder DateDatum was for das File geschrieben werden soll (20220311_weiterer_Name.pdf)
    DocTypeENUMRechnung, Quittung, Lieferschein, Lohnausweise, etc
    DocCategoryENUMHaus, Vermögen, Versicherung, Kinder, Weiterbildung, etc
    ForTaxBoolCheckbox ob es für die Steuern benötigt wird
    Preview*StringBaut bei OnChangeEvent eine Vorschau des Namens <FileDate_DocType_CustomText.pdf> *ReadOnly
    CustomTextStringEigener Text der angegeben werden kann
    Jo, dann schreib diese Klasse.

    Oh - ich hab was vergessen zu fragen: Wie soll denn diese Klasse heissen?
    vielleicht DocumentInfo?

    Jetzt aber: Anschliessend kannst du eine List(Of DocumentInfo) erstellen, deinen Dateiordner auslesen, und die Liste befüllen.

    Hmm - deine Antwort ist immer noch nicht ausreichend.
    ENUM - ist kein Datentyp.

    jedenfalls vorläufiges Ziel ist, DGV.Datasource = myListOfDocumentInfo auszuführen, dann kannste deine Datensätze schoma angucken.
    ComboboxColumns einrichten kommt später.



    edit:
    Oder du denkst noch ein Stück weiter, nämlich, dass du die Datensätze ja vielleicht auch einmal abspeichern willst.
    Dann kämen wir zum typisierten Dataset.

    ErfinderDesRades schrieb:

    vielleicht DocumentInfo?

    Das würde passen ja.

    ErfinderDesRades schrieb:

    Jetzt aber: Anschliessend kannst du eine List(Of DocumentInfo) erstellen, deinen Dateiordner auslesen, und die Liste befüllen.

    Macht Sinn. =)


    ErfinderDesRades schrieb:

    ComboboxColumns einrichten kommt später.

    Da hapert es noch in meinem Verständnis, wie man diese dann «später» hinzufügt.

    ErfinderDesRades schrieb:

    edit:
    Oder du denkst noch ein Stück weiter, nämlich, dass du die Datensätze ja vielleicht auch einmal abspeichern willst.
    Dann kämen wir zum typisierten Dataset.


    Ziel des ganzen ist folgendes:
    In diesem _Scan Ordner kommen alles gescannte Files rein. Diese haben immer etwa denselben Namen <<scan_datetime>>.
    Dies muss ich dann immer von Hand mühselig umbenennen und in den richtigen Ordner schieben.

    Mit dem Tool möchte ich, das etwas vereinfache um so auch möglichst eine gleichbleibende Namens-Konvention beizubehalten. (Datum_DocType_OneText.pdf)
    Deswegen auch das Preview Feld am ende des DGV damit man es noch sieht.

    Mit einem Button klick möchte ich dann, dass alle Files welche angepasst wurden im DGV an den richtigen Ort mit dem angegebenen Namen verschoben werden.
    .../_Scan/scan_123.pdf --> .../Finanzen/20220311_Lohnausweis_PersonA.pdf

    Und wen die Checkbox true ist, soll eine Kopie noch in den Steuerordner abgelegt werden um diese Endejahr nicht immer alle mühselig zusammen suchen zu müssen =)

    Beste Grüsse

    [line]---[/line]

    Edit:
    Die Klasse Sitzt und die Daten werden Angezeigt.

    C#-Quellcode

    1. public class DocumentInfo
    2. {
    3. public DocumentInfo(string filePath, string fileName, string fileDate, string docType, string docCategory, bool forTax, string customText)
    4. {
    5. FilePath = filePath;
    6. FileName = fileName;
    7. FileDate = fileDate;
    8. DocType = docType;
    9. DocCategory = docCategory;
    10. ForTax = forTax;
    11. CustomText = customText;
    12. }
    13. public String FilePath { get; set; }
    14. public String FileName { get; set; }
    15. public String FileDate { get; set; }
    16. public String DocType { get; set; }
    17. public String DocCategory { get; set; }
    18. public Boolean ForTax { get; set; }
    19. public String CustomText { get; set; }
    20. }



    Nun stehe ich aber vor der Grösseren herausforderung, die DGV etwas anzupassen.

    Die Felder DocType & DocCategory sollten da Comboboxen sein. Dies muss ja jetzt programmatisch erstellt werden, ich hatte dies via Designer gemacht, was jetzt ja nicht mehr geht. Oder irre ich mich da auch gerade :)

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

    HeyHo, ich dachte ich mach lieber eine neue AW, damit es nicht verwirrt.

    Das Laden der Items aus der Klasse geht, glaube ich, soweit ganz gut. Ich habe das DGV nun via Code Definiert und die Column welche es beinhalten muss.
    Siehe hier:
    Spoiler anzeigen

    C#-Quellcode

    1. List<DocumentInfo> docList = new List<DocumentInfo>();
    2. private void MainForm_Load(object sender, EventArgs e)
    3. {
    4. string[] filePaths = getFiles();
    5. var docTypes = getDocType();
    6. var docCategorys = getDocCategory();
    7. var fileNameColumn = new DataGridViewTextBoxColumn()
    8. {
    9. Name = "fileName",
    10. HeaderText = "Name",
    11. DataPropertyName = "fileName",
    12. ReadOnly = true,
    13. Width = 250,
    14. AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    15. };
    16. var fileDateColumn = new DataGridViewTextBoxColumn()
    17. {
    18. Name = "fileDate",
    19. HeaderText = "Date",
    20. DataPropertyName = "fileDate",
    21. MaxInputLength = 8,
    22. Width = 70,
    23. };
    24. var docTypeColumn = new DataGridViewComboBoxColumn()
    25. {
    26. Name = "docType",
    27. HeaderText = "Type",
    28. DataPropertyName = "docType",
    29. DataSource = docTypes,
    30. DisplayMember = "Name",
    31. ValueMember = "Id",
    32. DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
    33. };
    34. var fileCustomTextColumn = new DataGridViewTextBoxColumn()
    35. {
    36. Name = "customText",
    37. HeaderText = "Beschreibung",
    38. DataPropertyName = "customText",
    39. MaxInputLength = 30,
    40. };
    41. var docCategoryColumn = new DataGridViewComboBoxColumn()
    42. {
    43. Name = "docCategory",
    44. HeaderText = "Category",
    45. DataPropertyName = "docCategory",
    46. DataSource = docCategorys,
    47. DisplayMember = "Name",
    48. ValueMember = "Id",
    49. DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing,
    50. Width = 125,
    51. };
    52. foreach (string filePath in filePaths)
    53. {
    54. var FileName = Path.GetFileName(filePath);
    55. docList.Add(new DocumentInfo(filePath, FileName, null, 0, 0, false, null));
    56. }
    57. dataGridView1.Columns.AddRange(fileNameColumn, fileDateColumn, docTypeColumn, fileCustomTextColumn, docCategoryColumn);
    58. dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
    59. dataGridView1.AutoGenerateColumns = false;
    60. dataGridView1.DataSource = docList;
    61. }




    Nun stehe ich vor der Frage, wie füge ich eine Column "Preview" hinzu, welche mir den Namen anzeigt, der sich aus der Auswahl ergibt (<Date>_<Type>_<Beschreibung>.pdf)

    Ich sehe dabei 2 Möglichkeiten, entweder via Column wo ich nicht wüsste wie man das realisieren könnte.

    Oder rechts von dem DGV möchte ich noch eine Vorschau des PDFs anzeigen, da würde sich dann ggf. noch die Möglichkeit bilden den Namen, als Label anzuzeigen.

    Was denkt ihr, wäre die «Sinnvollere» Lösung?

    VLG

    ErfinderDesRades schrieb:

    der Getter der Prop bastelt dann den gewünschten Wert zusammen.

    Daran hab ich nicht mal gedacht.

    Ich habe das wie folgt versucht:

    C#-Quellcode

    1. // DataKlass
    2. public String newFileName;
    3. public String getNewFileName()
    4. {
    5. StringBuilder sb = new StringBuilder();
    6. sb.Append(FileDate + "_");
    7. sb.Append(DocType + "_");
    8. sb.Append(CustomText + ".pdf");
    9. return sb.ToString();
    10. }


    C#-Quellcode

    1. // Form1.cs
    2. var fileNewNameColumn = new DataGridViewTextBoxColumn()
    3. {
    4. Name = "newFileName",
    5. HeaderText = "Preview",
    6. DataPropertyName = "newFileName",
    7. ReadOnly = true,
    8. };


    doch die Anzeige in der View bleibt leer

    .Scare schrieb:

    Ich habe das wie folgt versucht:
    Der Versuch ergibt eine Methode - kein Property. Schnapp dir ein gut Buch, und lies nach, wie man in c# eine Property codet.
    Databinding funzt nur mit Properties.

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