VB.NET: Dateinamen aus Ordner in Tabelle speichern und als .csv speichern

  • VB.NET
  • .NET 4.5

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Rostam.

    Die Add...Row-Funktion hat standardmäßig 2 Überladungen. Die erste erfordert als Parameter eine fertige Row. Die hat man standardmäßig aber nicht. Die 2. Überladung nimmt als Parameter alle (!) Spaltenwerte entgegen. Wenn Du also 4 Spalten hast, dann musst Du 4* Parameter angeben. Intellisense hilft. Wenn Du für einen Parameter nichts angeben willst, kannst Du notfalls Nothing verwenden.

    * AutoIncrement-Spalten und welche mit Expression zählen da nicht rein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    HILFE HILFE HILFE

    Hab riesen Bockmist gebaut!!! :(

    Wollte die Dateinamen ändern. Dachte das kann ich einfach im Windows Explorer machen, dann konnte Visual Studio die Daten aber nicht mehr finden. Also zu gemacht und die Dateinamen wieder rückgeändert. Jetzt kann ich den Designer nicht mehr öffnen mit dieser Fehlermeldung im Anhang. Sonst hab ich im Code nichts mehr gemacht. Bis eben vor meinem Bockmist ging es noch..... Bitte bitte, darf doch nicht alles verloren sein morgens um 5.... :(
    Bilder
    • HILFE-1.png

      386,87 kB, 1.920×1.053, 15 mal angesehen
    • HILFE-2.png

      541,45 kB, 1.920×1.053, 14 mal angesehen

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

    OK. Ganz entspannt. Für's nächste Mal: Nur unter VS die Namen ändern. Weil: Das muss das Programm ja auch in der SLN-Datei und der VBPROJ-Datei abändern.
    Wenn Du das Programm über Menü -> Erstellen -> Projekt bereinigen bereinigst, zippst und hier per [Erweiterte Antwort] hochlädst, könnten wir die Fehler beseitigen. Ansonsten: Folge den Fehlermeldungen. Die sagen, dass ne doppelte Deklaration von X nicht zulässig sei. Also musst Du in der Form.Designer.VB schauen, wo die 2. Deklaration ist und das Problem beheben. Vielleicht ist es auch ein Namespace-Konflikt. Schwer zu sehen. Du kannst auch den Inhalt der Rechnungen.Designer.VB hier posten (in nem Spoiler). Dann können wir da auch schauen.
    Aber 1. Es geht hier nur darum, dass die UI nicht will. Der Code und das tDS stehen trotzdem! Also: Don't panic!
    2. Für die nächste Katastrophe: Backups machen. Regelmäßig.
    3.

    Rostam schrieb:

    Jetzt versuche ich das mal alleine hinzukriegen wie ich das Ding als CSV speichern kann.
    Falsche Abkürzung. Du solltest nicht ne CSV als Ziel haben, sondern ne XML. Das ist super easy mit nem tDS. Ne CSV wirst Du nicht sinnvoll Dein Ziel erreichen können. Denn: Falsche Datenstruktur. Bzw: in der CSV gibt es gar keine Datenstruktur.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    speichern
    Na, dazu habich doch schon in Post#7 das Tut angegeben.
    Einfacher als tDts.WriteXml(dateiname) geht nicht.

    zum Colorieren: coloriertes DatagridView
    Also das Prinzip ist, im DGV_CellPainting-Event sich den Datensatz holen, und aus diesem Datensatz auslesen, in welcher Farbe der ZellHintergrund gemalt werden soll.
    Alles annere das DGV selber malen lassen.

    VaporiZed schrieb:

    OK. Ganz entspannt. Für's nächste Mal: Nur unter VS die Namen ändern. Weil: Das muss das Programm ja auch in der SLN-Datei und der VBPROJ-Datei abändern.
    Wenn Du das Programm über Menü -> Erstellen -> Projekt bereinigen bereinigst, zippst und hier per [Erweiterte Antwort] hochlädst, könnten wir die Fehler beseitigen. Ansonsten: Folge den Fehlermeldungen. Die sagen, dass ne doppelte Deklaration von X nicht zulässig sei. Also musst Du in der Form.Designer.VB schauen, wo die 2. Deklaration ist und das Problem beheben. Vielleicht ist es auch ein Namespace-Konflikt. Schwer zu sehen. Du kannst auch den Inhalt der Rechnungen.Designer.VB hier posten (in nem Spoiler). Dann können wir da auch schauen.
    Aber 1. Es geht hier nur darum, dass die UI nicht will. Der Code und das tDS stehen trotzdem! Also: Don't panic!
    2. Für die nächste Katastrophe: Backups machen. Regelmäßig.

    Danke schön! Hat irgendwie geklappt. Durch meine Umbenenn-Triade war der Inhalt von Rechnungen.Designer.vb irgendwie durch meine Umbennenen-Versuch doppelt da war. Ein Mal unter dem alten Namen und ein Mal mit dem neuen Namen, den ich ja eigentlich gelöscht hatte. Ganz komische Sache. Jetzt Habe die neuen jetzt gelöscht und es läuft wieder. Aber der Projektmappen-Explorer sieht jetzt etwas leer aus. (Bild: läuft-wieder.jpg) Hoffe ich habe nichts falsches gelöscht.


    VaporiZed schrieb:

    3.

    Rostam schrieb:

    Jetzt versuche ich das mal alleine hinzukriegen wie ich das Ding als CSV speichern kann.
    Falsche Abkürzung. Du solltest nicht ne CSV als Ziel haben, sondern ne XML. Das ist super easy mit nem tDS. Ne CSV wirst Du nicht sinnvoll Dein Ziel erreichen können. Denn: Falsche Datenstruktur. Bzw: in der CSV gibt es gar keine Datenstruktur.

    ErfinderDesRades schrieb:

    speichern
    Na, dazu habich doch schon in Post#7 das Tut angegeben.
    Einfacher als tDts.WriteXml(dateiname) geht nicht.

    Ihr habt natürlich mal wieder Recht! Hatte gar nicht an die Datenstruktur gedacht und mich auf CSV festgelegt. Aber eigentlich totaler Schwachsinn! Vor allem denke ich wird es mit XML auch wesentlich einfacher das Ganze wieder zu öffnen und einzulesen, richtig? Auch wenn ich da jetzt noch keine Vorstellung habe WIE genau.... aber irgendwie ;)
    Also das mit WriteXml habe ich gerade mal auf einem anderen Projekt mit einem Button getestet und läuft. Aber da habe ich den Pfad und Dateinamen festgeschrieben. Wie kann ich das denn über das SaveFileDialog machen? Dazu habe ich noch nichts gefunden.



    ErfinderDesRades schrieb:


    zum Colorieren: coloriertes DatagridView
    Also das Prinzip ist, im DGV_CellPainting-Event sich den Datensatz holen, und aus diesem Datensatz auslesen, in welcher Farbe der ZellHintergrund gemalt werden soll.
    Alles annere das DGV selber malen lassen.

    Danke schön, ich werde mir das merken und ganz am Ende wenn das Programm steht diese Nice-to-Have Option auch probieren. Das hat jetzt gerade irgendwie Prio G oder so ;)
    Bilder
    • läuft-wieder.jpg

      317,16 kB, 1.800×816, 16 mal angesehen

    ErfinderDesRades schrieb:

    Dialoge sind eiglich immer nach demselben Prinzip gestrickt.
    Dialoge benutzen ist einfach

    Also irgendwie komme ich mit dem SaveFIleDialog nicht so ganz zurecht. Ich kann es zwar öffnen und so.... (wobei ich auch da nicht ganz sicher bin ob das so korrekt ist, aber es funktioniert irgendwie) ....aber dann beim Speichern muss ich doch irgendwie den gewählten Pfad und den frei eingegebenen Dateinamen an die Funktion übergeben, oder nicht?? Oder stehe ich jetzt ganz auf'm Schlauch??
    Also das ist mein bisheriger Code und egal was ich auswähle, der schreibt das korrekte Ding in den fest eingetragenen Pfad. Das ist ja soweit auch logisch weil die Variable ja mit in die Funktion übergeben wird. Nur wie ich das ändere, dass der die Daten aus dem Dialog nimmt, das leuchtet mir nicht ein.

    VB.NET-Quellcode

    1. Private MyXmlFilePath = "D:\Testordner\Export\XMLTest.iof"
    2. Private Sub SpeichernUnterToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernUnterToolStripMenuItem.Click
    3. SaveFileDialog1.Filter = "XML File|*.xml"
    4. SaveFileDialog1.Title = "Save an XML File"
    5. If SaveFileDialog1.ShowDialog(Me) = DialogResult.OK Then
    6. Me.Validate()
    7. InvoiceDGV.EndEdit()
    8. InvoiceOverviewDataSet.WriteXml(MyXmlFilePath)
    9. End If
    10. End Sub


    Und dann soll der natürlich noch checken ob es den gewählten Dateinamen schon gibt und wenn ja, dann nicht speichern damit man einen neuen Namen wählen muss. So das Übliche eben. Ich nehme an der Dialog macht solche Überprüfungen nicht selber und das muss alles eingegeben werden? IF? Exception? Wie? Beim Klick auf "Speichern" im SaveFileDialog? Aber wie kann man darauf zugreifen?



    Ich habe hier auch ein FolderBrowserDialog zum Auswählen des Ordners von dem der die Dateinamen einlesen soll. Das klappt auch soweit alles gut. Nur ich nehme an der Dialog merkt sich nicht aus welchem zuletzt eingelesen wurde, sodass er direkt zu diesem Pfad gehen soll? Das es jetzt aus der Entwicklungsumgebung nicht klappt, ist klar, weil der das ja jedes Mal neu kompiliert und praktisch zum ersten Mal aufruft. Aber man muss ihm doch bestimmt beim öffnen des Dialogs den zuletzt genutzten Pfad übergeben können, oder? Meine Idee wäre einfach irgendwo den letzten ausgewählten Ordnerpfad in eine Datei schreiben und beim Aufruf des FolderBrowserDialog den Inhalt dieser Datei als Variable mit übergeben. Hier würde denke ich auch eine CSV ausreichen, weil es ist ja sowieso nur ein String, richtig? Aber wie übergebe ich dem Dialog das Ding? Würde das einfach so gehen: FolderBrowserDialog1.ShowDialog(variableMitPfadZumOrdner) :?:

    Rostam schrieb:

    muss ich doch irgendwie den gewählten Pfad ...
    der gewählte Pfad heisst FileDialog1.FileName.

    Rostam schrieb:

    FolderBrowserDialog zum Auswählen des Ordners von dem der die Dateinamen einlesen soll. Das klappt auch soweit alles gut. Nur ich nehme an der Dialog merkt sich nicht aus welchem zuletzt eingelesen wurde, sodass er direkt zu diesem Pfad gehen soll?
    wieso nimmst du sowas an?
    probiers aus und stelle fest, dass du dich irrst.
    Das steht aber doch im tut, dass ein Dialog sich das gewählte merkt, und (wenn mans nicht ändert) damit beim nächsten mal wieder aufmacht - oder habich das vergessen zu erwähnen?

    (Sieht mir bischen nach mangelnde Initiative aus - hast du die dem Tut beiliegenden sources denn wenigstens mal gedownloaded und ausprobiert?)

    ErfinderDesRades schrieb:

    Rostam schrieb:

    muss ich doch irgendwie den gewählten Pfad ...
    der gewählte Pfad heisst FileDialog1.FileName.

    Danke! Habe das jetzt so: InvoiceOverviewDataSet.WriteXml(SaveFileDialog1.FileName) Problem dabei ist jetzt aber wenn ich das ein Mal speichere und dann einen anderen Ordner einlese und diesen speichern will, dann steht im Feld "Dateiname" der komplette Pfad und Name der zuletzt gespeicherten Datei. Das darf ja nicht sein. Der öffnet zwar korrekt den alten Pfad, wie Du schon sagtest, aber, dass der den kompletten Pfad (in diesem Fall: "D:\Testordner\Export\Testdatei.xml") als Dateiname vorgibt ist ja falsch. Zumal man ja Doppelpunkt und '/' bzw '\' gar nicht für einen Dateinamen nutzen kann.

    ErfinderDesRades schrieb:

    Rostam schrieb:

    FolderBrowserDialog zum Auswählen des Ordners von dem der die Dateinamen einlesen soll. Das klappt auch soweit alles gut. Nur ich nehme an der Dialog merkt sich nicht aus welchem zuletzt eingelesen wurde, sodass er direkt zu diesem Pfad gehen soll?
    wieso nimmst du sowas an?
    probiers aus und stelle fest, dass du dich irrst.
    Das steht aber doch im tut, dass ein Dialog sich das gewählte merkt, und (wenn mans nicht ändert) damit beim nächsten mal wieder aufmacht - oder hab ich das vergessen zu erwähnen?
    Zumindest habe ich das in Deinem Tut nicht gesehen. Habe gerade auch nochmal geguckt. Aber Du hast Recht, es geht! Der merkt sich das sehr wohl und meine Annahme war falsch. Warum ich darauf kam, weiß ich gerade selber nicht. Ich hatte es aber einige Male probiert und der hatte sich den Pfad nicht gemerkt. Keine Ahnung was da das Problem war.

    ErfinderDesRades schrieb:

    (Sieht mir bischen nach mangelnde Initiative aus - hast du die dem Tut beiliegenden sources denn wenigstens mal gedownloaded und ausprobiert?)
    Also von mangelnder Initiative kann hier keine Rede sein, wenn ich bis morgens um 5 rumprobiere, Dein Tut durchteste, bei Youtube Tutorials anschaue und mitmache und auch auf anderen deutsch- und englisch-sprachigen Plattformen mich zu informieren versuche.... und erst wenn es nicht funktioniert hier Euch das Problem schildere. Dabei schreibe ich natürlich auch noch andere Punkte an die ich im Moment denke.... aber wenn ich tatsächlich an einem Punkt hänge, schreibe ich nie ohne es selber mehrere Male auf unterschiedliche Wege probiert zu haben.

    Deine Dateien habe ich mir natürlich auch angeschaut. Wenn ich Dir dazu mal einen Verbesserungsvorschlag machen darf: Wenn das für jemanden ist, der das verstehen und auch lernen soll was Du da in Deinem Code schreibst, dann wären m.M.n. aussagekräftige Kommentare sehr sinnvoll. Das heißt z.B. was macht "Select Case True" und "Case ....", woher kommt die Variable "Lf", wo wird sie deklariert und was ist darin gespeichert, Warum hat die If-Anweisung kein Then-Statement, sondern danach folgt einfach ein Return. Solche Sachen kann man sich sicher über mehrere andere Tutorials, Bücher, YT-Videos und Foren zusammenreimen um dann Dein Tut zu verstehen.... aber wenn Du diese Sachen im Tut verwendest, wäre es (finde ich) hilfreich zu erklären wie/woher und auch warum Du es so machst und nicht anders. Just my humble opinion :)

    Auf jeden Fall Danke für Deine Tipps und Hilfestellungen! :thumbup:

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Rostam“ ()

    Rostam schrieb:

    Problem dabei ist jetzt aber wenn ich das ein Mal speichere und dann einen anderen Ordner einlese und diesen speichern will, dann steht im Feld "Dateiname" der komplette Pfad und Name der zuletzt gespeicherten Datei. Das darf ja nicht sein. Der öffnet zwar korrekt den alten Pfad, wie Du schon sagtest, aber, dass der den kompletten Pfad (in diesem Fall: "D:\Testordner\Export\Testdatei.xml") als Dateiname vorgibt ist ja falsch. Zumal man ja Doppelpunkt und '/' bzw '\' gar nicht für einen Dateinamen nutzen kann.
    Wenn der volle Pfad nicht drinstehen soll, dann lösch ihn doch, bevor der Dialog angezeigt wird: DeinSaveFileDialog.FileName = Nothing. Und das mit :, \, / stimmt nicht. Man darf einen vollen Pfad angeben. Also Verzeichnis+Dateiname.

    Rostam schrieb:

    Das heißt z.B. was macht "Select Case True" und "Case ....", woher kommt die Variable "Lf", wo wird sie deklariert und was ist darin gespeichert, Warum hat die If-Anweisung kein Then-Statement, sondern danach folgt einfach ein Return.
    Select Case True: geht nicht anders bei Objektvergleichen; Lf: Sagt Visual Studio beim Draufzeigen oder Navigieren zu Definition. Ist eine Framework-Konstante. If ohne Then? Zeig mir die Zeile und ich zeig Dir das Then
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Rostam: Tschuldigung - da habich dir wohl unrecht getan mit meine "mangelnde-Initiative"-Vermutung.
    Die Vermutung kam halt daher, dass du eine Frage stelltest, zu deren Beantwortung du eiglich alles vor der Nase hättest haben müssen, wenn du das Tut im VS geöffnet hast, und angeguckt, wie dort mittm FileDialog gearbeitet wird.
    Dein Pech war wohl, dass du das iwie übersehen hattest, dadurch entstand halt mir der Eindruck.
    Dabei bin ich überhaupt nicht der Ansicht, man soll sich sonstwie einen abbrechen, bevor man es überhaupt wagt, eine Frage ans heilige Forum mit seine Großkopfeten zu stellen.
    Ist ja uneffektiv, nächtelang etwas zu begrübeln, was man mit einer einfachen Frage in einer Stunde geklärt hat.
    Ich bin auch nicht der Ansicht, dass man nie etwas übersehen oder überlesen darf - schon weil ich selbst so viel übersehe, schlampig lese etc..
    Also tut mir wirklich leid, das Missverständnis, und bin froh, dasses ausgeräumt ist.
    Zu deine Fragen mit dem immediate If, dem Select Case, etc...
    Da bin ich ebenfalls froh, dass du fragst - du setzst dich also mit auseinander und formulierst Probleme in absolut verständlicher Weise (was ühaupt nicht selbstverständlich ist).
    Und wo du fragst, kann man auch antworten, und ich denke, da kannste dann auch sehr schnell vorankommen, und mir macht die Beschäftigung mittm Forum dann auch am meisten Spass.
    Also konkret: Die von dir angesprochenen "Tut-Mängel" - die waren halt nicht Thema des Tuts.
    Das sind einfach Bestandteile der Sprache, Grundlagenwissen quasi.
    Jo, könnte man auch erklären, oder kann man auch Tuts zu machen. Jdfs. grundsätzlich kann ich nicht in eim Tut alles und jedes erklären, was die Sprache VB ausmacht, da muss ich iwo die Grenze ziehen.
    Hätte ich jetzt zu meiner Verteidigung gesagt, aber vielleicht. war ich auch einfach zu faul, oder unaufmerksam.
    Was anneres ist auch meine tut-Strategie, dass ich auch darauf baue, dass Nachfragen gestellt werden, die ich beantworte. So wird das Tut vlt. bischen lebendiger, und werden mehr die Dinge besprochen, die die Leuts wissen wollen.
    Wie dem auch sei:
    • if()
      das ist der If-Operator (im Gegensatz zur If-Anweisung). Das ist bei den VB-Schlüsselworten ausgezeichnet erklärt - besser als ich in eim Tut könntete. Da fällt mir noch ein Grund ein, es nicht zu erklären: Schlüsselworte etc. sind so wichtig, das sollte man sich nicht als Halbwissen aus Foren aneignen, sondern da sollte man eine Dokumentation, ein Buch oder sonstwas sich reinziehen, was Referenz-Charakter hat - also vollständig und 100% richtig erklärt.
    • Select Case
      Dasselbe wie oben, und den Link mitte Schlüsselworte haste jetzt ja
    • LF
      Jo, wie Vaporized sagt. Hier berühren wir das Thema Debuggen - dassis auch ein grosses Thema, und mehrerer Tuts wert, und kann in eim Dialoge-Tut nicht abgedeckt werden. Aber da kann dieses Video-Tut u.U. dir von großem Nutzen sein: VisualStudio nutzen
    Das mit den Dateinamen hab ich nicht verstanden, warum das ein Problem ist, wenn der FileDialog den ganzen FileNamen hält.
    Kannste ja kürzen, etwa mit

    VB.NET-Quellcode

    1. dim filNam = System.IO.Path.GetFileName(FileDialog1.Filename)

    System.IO.Path hat noch weitere so nützliche Funktionen - guck dir das mal an. Wie das ühaupt geht, "etwas anzugucken", ist ebenfalls in VisualStudio nutzen gezeigt.

    Oder du erstellst dir daraus ein FileInfo - müssteste ebenfalls hinkriegen, wennde das Tut gesehen hast.
    FileInfo ist ziemlich praktisch, wenn man mit demselben File mehrere Operationen zu tun hat.
    Danke Euch! Habe Eure beiden Antworten jetzt erstmal schnell überflogen. Muss das jetzt in Ruhe alles durchgehen und melde mich dann nochmal. Bin froh so ein gutes Forum gefunden zu haben, wo meine (manchmal vielleicht auch dummen) Fragen auch ordentlich und freundlich beantwortet werden. Super!! :thumbup: :thumbup: