Datenbank für Bilder und Videos

  • VB.NET

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von cmediapro.

    Guten Morgen!

    Schau mal bitte. Ich hab mich nun letzte Nacht an den Code zum Eintragen des Files vorgenommen.


    VB.NET-Quellcode

    1. Private Sub Auswahl(ByVal dgvCell As DataGridViewCell)
    2. Using fileDialog As New OpenFileDialog()
    3. fileDialog.CheckFileExists = True
    4. fileDialog.CheckPathExists = True
    5. fileDialog.Filter = "Alle Dateien|*.*"
    6. fileDialog.Title = "Wählen Sie eine Datei"
    7. fileDialog.Multiselect = False
    8. If fileDialog.ShowDialog() = DialogResult.OK Then
    9. Dim fileInfo As New FileInfo(fileDialog.FileName)
    10. Dim binaryData As Byte() = File.ReadAllBytes(fileDialog.FileName)
    11. DataGridView1.Rows(dgvCell.RowIndex).Cells(1).Value = fileInfo.Name
    12. If _myAttachments.ContainsKey(dgvCell.RowIndex) Then
    13. _myAttachments(dgvCell.RowIndex) = binaryData
    14. Else
    15. _myAttachments.Add(dgvCell.RowIndex, binaryData)
    16. End If
    17. End If
    18. End Using
    19. End Sub


    Der zeigt mir nun Fehler an, dass auf die _myAttachments auf Grund ihrer Sicherheitsstufe nicht zugegriffen werden kann. Was hat das zu bedeuten?
    Iwie nix angekommen, von dem was ich sage:

    ErfinderDesRades schrieb:

    Anschließend das DGV_CellContentClick - Event behandeln, und dort den OpenFileDialog starten.
    Ich sage "den" OpenFileDialog, weil man den am besten einfach aufs Form zieht, sodass man ihn immer wieder verwenden kann.
    ... weil man den am besten einfach aufs Form zieht: Ist das iwie schwer zu verstehen?

    ErfinderDesRades schrieb:

    ...nur mit dem ofd einen DateiNamen auswählen, der dann in die aktuelle SceneRow eingetragen wird. Mehr nicht.

    ... in die aktuelle SceneRow eingetragen wird: Is ja klar - du trägst es natürlich ins DGV ein und nicht direkt in die SceneRow.

    ... Mehr nicht: Auch klar: müssemer natürlich sofort zusätzliche sinnlose Datei-Kopier-Operationen implementieren.

    Wäre ja auch zu einfach, wenn man die Kopiererei erst macht, nachdem alle Scenen vollständig eingegeben sind.
    Sry, ich habe dich nicht ganz auf dem Laufenden gehalten...

    Das hatte ich gestern schon. Aber ich finde es ziemlich unpraktisch, jede einzelne Datei einzeln auswählen zu müssen. Ist es nicht praktischer einen OFD zu öffnen und dann mehrere Dateien auszuwählen, und diese dann jeweils in eine Row zu schreiben?

    Was meinst du damit, dass ich direkt ins DGV eintrage? Muss ich das nicht? Bzw. kommt das nicht auf das Gleiche raus? Ich trage doch auch manuell die Daten in den DGV ein... Oder seh ich das falsch?
    Das hatte ich gestern schon.
    Was hattest du gestern schon?

    cmediapro schrieb:

    Ist es nicht praktischer einen OFD zu öffnen und dann mehrere Dateien auszuwählen, und diese dann jeweils in eine Row zu schreiben?
    gute Idee - aber warum ist in deim Code Multiselect= False eingestellt?
    ah - jetzt verstehe ich. Nein, beim CellContentClick wird nur eine Datei festgelegt.
    Womit gemeint ist, dass sie zugefügt oder geändert wird - löschen macht ja das DGV.

    Dann ist immer noch fraglich, warum du die Dateien bereits bei Auswahl kopierst.
    Auswahl der Dateien und KopierVorgang in einen Ausgabe-Ordner muß unbedingt getrennt sein, denn nach der Auswahl wird ja noch alles bearbeitet, und u.U. wird eine Datei auch wieder rausgeschmissen.
    Ah okay, verstehe!
    Das macht natürlich Sinn - und erst beim Drücken auf Save wird dann effektiv kopiert, richtig?

    Noch was, was ich gestern hatte. Ich geh jetzt mal von einem ganz simplen CellContentClick aus, der nur ein OFD öffnet:

    VB.NET-Quellcode

    1. Private Sub dgv_CellMouseClick(ByVal sender As Object, _
    2. ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles _
    3. DataGridView1.CellMouseClick
    4. ofd()
    5. End Sub


    Öffnet der bei jedem Klick, nicht nur auf den Button, sondern auch auf die Textfelder das OFD. Wie kann ich das umgehen?

    Edit: Ah, sicher mit einer simplen If Index abfrage, richtig?
    Schau dir mal das DataGridViewCellMouseEventArgs (e) an. Da gibs Member, mit denen du Zeile und Spalte identifizieren kannst. Columnkopf is z.B. -1. Und den Celltype kannst du mit is Type auf Buttoncolumn prüfen.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Dank Dir, Vatter, für den Tipp!

    Ich bin hier gerade noch etwas am ausprobieren, aus reinem Interesse, zum Lernen und zum besseren Kennenlernen des DataGridViews.

    Kann mir einer von Euch sagen, wieso dies nicht funktioniert?

    Edit: Es geht jetzt noch mal um das Schreiben des Pfades auf den Button.

    VB.NET-Quellcode

    1. Private Sub dgv_CellMouseClick(ByVal sender As Object, _
    2. ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles _
    3. DataGridView1.CellMouseClick
    4. If DataGridView1.Columns(e.ColumnIndex).DataPropertyName = "File" Then
    5. ofd()
    6. Dim x
    7. Dim y
    8. x = DataGridView1.CurrentCell.RowIndex
    9. y = DataGridView1.CurrentCell.ColumnIndex
    10. DataGridView1(x, y).Value = OpenFileDialog1.FileName
    11. End If
    12. End Sub


    Das Szenario sieht so aus, dass wenn ich in die 1. Column, 1. Row auf den Button drücke, der Pfad letztendlich bei Row 2 auf einem anderen Feld (dem ersten ID Feld) landet. Der Button ist aber rechts daneben auf Position 2.
    Wenn ich das gleiche in Row 2 tue, sitzt der FileName passend auf dem Button.
    In Row 3 bekomme ich eine Fehlermeldung.

    Müsste das nicht eigentlich funktionieren?

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

    Neneneneneneeee, du hast dochn typisiertes Dataset drangebuinden getan. Also mußt du die Text-Eigenschaft der ButtnColumn an die entsprechende Eigenschaft deiner Bindingsource binden tun. Und dann ännerst du nicht den Buttontext sondern die entsprechende Property des Datensatzes.
    Auch das findich....

    VB.NET-Quellcode

    1. If DataGridView1.Columns(e.ColumnIndex).DataPropertyName = "File" Then
    tu doch so:

    VB.NET-Quellcode

    1. If Type Of ( DatagridView1.Columns(e.ColumnIndex)) is DatagridViewButtonColumn Then
    Und dann noch (vorher) den RowIndex auf Gültigkeit prüfen.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hast du da ein direktes Beispiel, warum das nicht funktioniert? Bzw. wo der Unterschied zur BindingSource liegt?
    Ich will das nur verstehen ;)
    Ich gebe manuell die Daten doch auch in den DataGridView ein und speichere diese dann.
    Oder nicht?

    Durch die Funktion der BindingSource steig ich noch nicht ganz durch... Gibt es da vielleicht ein gutes Beispiel im Internet, wo das Beispielsweise an der Funktion des ButtonClicks einmal gut erklärt ist? Einfach, um es zu verstehen!
    Durch die Funktion der BindingSource steig ich noch nicht ganz durch.
    Dein Sample ist auch noch zu primitiv, als dass du daran den Sinn und die Power von BindingSource erkennen könntest.
    In komplexeren Szenarien geht aber garnix mehr ohne BindingSource, und da isses vlt. nützlich, sich von vornherein dran zu gewöhnen, niemals aus den Controls die Daten abzurufen, sondern immer aus der BindingSource.
    Damit hat man einen einheitliche Vorgehensweise, die auch später ühaupt kein Problem damit hat, wenn die Anforderungen mal erheblich komplexer werden.

    Hingegen gewöhnst du dir hier nun das Gefummel im DataGridView an, so wirst du später höhere Anforderungen nicht bewältigen können.


    Deine anneren Fragen sind total unklar gestellt
    Hast du da ein direktes Beispiel, warum das nicht funktioniert? Bzw. wo der Unterschied zur BindingSource liegt?
    Ich will das nur verstehen ;)
    Ich gebe manuell die Daten doch auch in den DataGridView ein und speichere diese dann.
    Oder nicht?
    Hast du da ein direktes Beispiel, warum das nicht funktioniert?
    was funktioniert nicht?
    Bzw. wo der Unterschied zur BindingSource liegt?
    Unterschied zu was?
    Ist ja auch egal! ;) Ich dachte nur, dass es vielleicht Sinnvoll für´s Verständnis wäre, wenn ich wüsste, warum das so mit der Möglichkeit ni, die ich oben beschrieben habe, nicht funktioniert.
    Lassen wir das an dieser Stelle.

    Lassen wir das ganze noch einmal passé passieren:
    Ich habe ein typisiertes DataSet mit Anbindung an ein DataGridView. Über Buttons kann ich die Pfade einfügen. Speichern, Load, Bearbeiten und Entfernen von Rows funktioniert.
    ErfinderDesRades,

    Hast du einen Ansatz für mich, wie ich es schaffe nun die ausgewähle Datei in den Ressourcen Ordner zu kopieren?
    Muss ich die Daten erst irgendwo temporär öffnen, und dann neu abspeichern, oder geht das On-The-Fly?

    Die Diashow mit den Bildern und den Videos funktioniert einwandfrei. Ich hatte erst das Problem, dass der Mediaplayer die Bilder nur 5 Sekunden abgespielt hat, und danach schwarz zeigt. Aber das konnte ich durch einen kleinen selbstgeschriebenen Algorithmus umgehen.
    zunächstmal brauchst du wohl einen Button und einen OpenFolder-Dialog, um den Ausgabe-Ordner ühaupt erstmal zu bestimmen.

    Dann durchlaufe die Scene-DataTable mit ForEach, und mit FileInfo.CopyTo kopierste die Dateien in den AusgabeOrdner.
    ausserdem kopierste noch die ArbeitsDatei selbst in die Ausgabe - dann hast du doch alles arbeitsfähig beisammen.
    Hallo Erfinder,
    ich Danke Dir für Deinen Rat!
    Ich bin soeben fertig geworden mit dem Programm! ;)

    Funktioniert alles einwandfrei. Ich werd mich jetzt noch etwas dransetzen, und das Programm mal auf Herz und Nieren testen und eventuelle Fehler ausschließen!

    Beste Grüße,
    Chris