OpenFileDialog und DataGridView

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von daniel303.

    OpenFileDialog und DataGridView

    Guten morgen,
    ich bin in einer kleinen Sackgasse mit meinem Programm. Im Prinzip sehr simpel aber ich komm einfach nicht drauf:
    Ich will mit einem OpenFileDialog mehrere Dateien in ein DataGridView schreiben (bzw. deren Pfade).
    So das DataGridView hat zwei Spalten: Dateiname und Status.
    Wenn ich die Dateien im OpenFileDialog ausgewählt habe sollen diese untereinander in die erste Spalte eingefügt werden, klappt aber natürlich nicht.
    Hier die verantwortliche Zeile:

    VB.NET-Quellcode

    1. DataGridView1.Rows.Add(OpenFileDialog1.FileNames)


    Hoffe mir kann jemand einen Tipp geben :)
    Danke
    Du bekommst von OpenFileDialog eine Liste mit PfadNamen wieder.
    Nun solltest du eine Schleife für die Pfadnamen bauen.

    VB.NET-Quellcode

    1. For Each Datei as String in .....
    2. ' Hier kommen die Daten ins DGV
    3. Next Datei

    Ab welcher Zeile(Row) nun geschrieben wird

    VB.NET-Quellcode

    1. ' Anzahl der Zeilen im DGV
    2. Dim _Rows_Count As Integer = DGV.RowCount - 1
    3. For i = 0 To _Rows_Count
    4. DataGridView1.AllowUserToAddRows = True
    5. DataGridView1.Rows.Add()
    6. DataGridView1.Rows(RowCount).Cells(0).Value = My.Computer.FileSystem.GetName(foundFile)
    7. DataGridView1.Rows(RowCount).Cells(1).Value = foundFile ' Add Pfad und Datei Name
    8. DataGridView1.Update()
    9. DataGridView1.AllowUserToAddRows = False
    10. next i


    So wenn du nun beide Teile zusammenbastelst und die Variablen an dein Code anpasst, müsstest es funktionieren.
    Das ist kein C&P, es sind nur zusammen gewürfelte schnipsel.

    Für My.Computer..... nimmst du besser
    IO.Path.Get....
    In Most Primitive gibts ein Form mit einem Datagridview, welches Datensätze laden und speichern und alles kann.
    Der notwendige Code ist überaus einfach:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class frmDGV
    3. Private _DataFile As New FileInfo("..\..\Data.xml")
    4. Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    5. If Not _DataFile.Exists Then Return
    6. Me.DataDts.ReadXml(_DataFile.FullName)
    7. End Sub
    8. Private Sub Form_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
    9. Handles Me.FormClosing
    10. DataDts.WriteXml(_DataFile.FullName)
    11. End Sub
    12. End Class

    Daten werden nicht dem DGV zugefügt, sondern der DataTable, an die das DGV gebunden ist.

    VB.NET-Quellcode

    1. With frm '( As Form )
    2. Me.DataDts.ChildInfo.AddChildInfoRow( _
    3. .RichTextBox1.Text, .Left, .Top, .Width, .Height, .CreatedAt)
    4. End With

    Vorraussetzung ist ein typisiertes Dataset mit einer DataTable mit den erforderlichen Datenspalten. kann man sich im Designer zusammenklicksen.
    Damit hättest du auch den Schritt zur Trennung von Gui und Daten vollzogen - Grundlage einer tragfähigen AnwendungsArchitektur.
    Danke erstmal an euch beide für die Antworten.

    Da mir die Antwort von Erfinder doch etwas zu kompliziert erscheint habe ich die Lösung von Bernd getestet und stolpere nun über die beiden Zeilen:

    VB.NET-Quellcode

    1. DataGridView1.Rows(RowCount).Cells(0).Value = My.Computer.FileSystem.GetName(foundFile)
    2. DataGridView1.Rows(RowCount).Cells(1).Value = foundFile ' Add Pfad und Datei Name


    Also nochmal: Ich will die kompletten Pfade + Dateinamen untereinander in die erste Spalte einfügen.
    Aber warum dann: "My.Computer.FileSystem.GetName(foundFile)" ? Der Pfad+ Dateiname steht ja schon fest.
    Was ist wenn der Benutzer dann statt 2 Dateien nun 20 auswählt? Werden diese einfach untendrunter gehängt?

    Tut mir leid aber mir ist das irgenwie nicht schlüssig?!

    #Edit: Hat sich erledigt! Habs hinbekommen!
    Dankeschön! :thumbsup:

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

    daniel303 schrieb:

    Da mir die Antwort von Erfinder doch etwas zu kompliziert erscheint...
    Naja - vlt. kommstejamal iwann dazu, dassdedir Gedanken über AnwendungsArchitektur machen mußt.;)

    Weil Datenverarbeitung ohne Datenklassen (wenn man alles zB. im DGV herumfrickelt) - das rächt sich ziemlich schnell.
    Also führt mit steigenden Ansprüchen zu überproportional viel und unsicherem Code.

    Und bei deiner Anforderung ist ja bereits absehbar, dass Datensätze zu verarbeiten sind, mit mindestens den Eigenschaften Dateiname und Status.
    Vermutlich kommt noch DateiFullname hinzu, wennichmal davon ausgehe, dass du im Grid nur die Dateinamen anzeigen möchtest, nicht die kompletten Pfade.
    DateiFullname würde im Grid nicht gebraucht, aber logischerweise bei einer Verarbeitung, die dann auch mit den Dateien arbeiten wird.
    Die DataGridView diente lediglich zur besseren Übersicht.
    Das die Daten darin weiterverarbeitet werden ist schon klar aber es wird immer nur der Inhalt
    einer Zelle gebraucht (also den Pfad + Dateinamen)
    Wenn der Vorgang abgeschlossen ist, wird bei "Status" der jeweiligen Datei "Erfolgreich" oder eben
    "Fehler" angezeigt. Wo wir schon mal dabei sind:
    Wie kann ich in einer MsgBox praktisch einen bestimmten teil des Textes sozusagen "Klickbar" machen?

    Also Hintergrund ist der: Wenn alle Daten verarbeitet sind, wird am ende angezeigt "Erfolgreich: (z.B.) 10" und "Fehler (z.B.) 1" angezeigt.
    Mein Programm verfügt über einen CrashLog und dieser bzw. die Funktion soll beim Klicken auf (z.B.) "Fehler" aufgerufen werden.

    Wie kann ich dies realisieren?
    Danke System! Funktioniert soweit!

    Ein großes Problem habe ich allerdings noch :cursing:
    Glaube kaum das mich jetzt jemand versteht aber ein versuch ist es wert.
    Ich habe in meinen Hauptthread, ein Button-Event welches eine Funktion startet , diese Funktion
    arbeitet eine Abfrage ab. Bei bestimmten Bedingungen, startet diese eine weitere Funktion,
    die wiederum andere Dinge tut. Diese Funktion übergibt schlussendlich Variablen an einen von der Funktion
    erstellten Thread. Dieser Thread arbeitet dann die Hauptaufgabe ab.

    So nun habe ich auf der Form in meinem Hauptthread eine ProgressBar.
    Ihr könnt euch sicher denken worauf ich hinaus will :rolleyes:
    Wie ihr oben schon lesen könnt handelt es sich ggf. um mehrere Dateien.
    Da ich aus dem anderen Thread sowieso nicht einfach auf den Hauptthread bzw. auf die ProgressBar zugreifen kann und
    ich auch nicht weiß wie ich der Progressbar ihre Werte geben soll, finde ich keinen Weg, dem User einen Status zu übermitteln.

    Fürs Verständnis:
    Variante 1:
    -Thread startet
    -Eine Datei in der Liste
    -Schleife durchläuft einmal
    -Nach und nach (In der Schleife) Value += 10 an die ProgressBar übermitteln

    Variante 2:
    -Thread startet
    -5(z.B.) Dateien in der Liste
    -Schleife durchläuft 5 mal
    -An 10 Stellen in der schleife wird Value + =10 übergeben
    -Execption: ProgressBar überschreitet Maximum von 100 da sie 5 mal durchlaufen wird

    Besser erklären geht nicht :pinch:

    MfG daniel303
    Ja klar warum ist mir das nicht eingefallen ^^ Danke euch beiden!
    Das mit Progressbar.Increment(Zahl) wusst ich noch gar nicht :S

    Na ja wie das Lebel so Spielt nächstes Problem:
    Ich hab in die DataGridView noch zwei weitere Spalten eingefügt.
    In die eine (Textbox) sollen nur Zahlen hineingeschrieben werden. Mein gescheiterer Versuch:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    2. If Not IsNumeric(DataGridView1.Item(0, DataGridView1.CurrentRow.Index)) Then
    3. nameErrorProvider.SetError(Me.DataGridView1, "Die Spalte ""Größe"" darf nur zahlen enthalten!")
    4. Else
    5. nameErrorProvider.SetError(Me.DataGridView1, String.Empty)
    6. End If
    7. End Sub