Hallo,
ich brauche eure Hilfe.
Ich habe eine ListView die mit einem bestimmten Pfad verknüpft ist, die Dateinamen laden und anzeigen soll. Wenn man eine .csv Datei auswählt muss der Inhalt in einer anderen Listview eingefügt werden.
Es geht darum wenn ich eine Datei in meiner ListView auswähle möchte ich das der Inhalt auf eine andere Listview angezeigt wird (Dabei handelt es sich in der ersten ListView um keine eingetragenen Dateien, sondern mit einem Pfad ausgelesene Dateien. Bei einem Klick auf eine der angezeigten Dateien soll sich der Inhalt der .csv Datei in eine ListView eintragen.)
Bitte nur in C# antworten, da ich momentan noch keine andere Sprache beherrsche.
LG Marcel
P.s: (Windows Forms)
Bitte nur in C# antworten, da ich momentan noch keine andere Sprache beherrsche.
Ich hoffe, Deutsch ist auch okay 😉.
Kurze Nachfrage: was hast du denn probiert, und woran scheitern deine Versuche?
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Hi LaTino,
Klar xD, es geht auch Englisch und Französisch. 👅
Ich habe eine ListView die mir verschiedene .csv Dateien anzeigt. Wenn ich eine der Dateien anklicke soll sich der Inhalt der ausgewählten Datei öffnen. Daran scheitert es, ich weis nicht wie ich mit dem StreamReader immer ein anderen Pfad auswählen kann und mir der Inhalt der .csv Datei angezeigt wird.
LG Marcel
Bleiben wir beim ersten Teil von LaTino's Frage: Was hast du bisher probiert?
// EDIT: Schaffst du es denn schon, eine CSV-Datei einzulesen?
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hi inflames2k,
ich habe bereits probiert durch das Clickevent meiner ListView eine foreach Schleife zu erstellen und den Filenamen und Pfad auszulesen.
private void FileView_SelectedIndexChanged(object sender, EventArgs e)
{
string line;
foreach (string filename in Directory.GetFiles(@"Z:\", "*.csv*"))
{
string path = Path.GetFileName(@"Z:\", "*.csv*");
}
using (StreamReader file = new StreamReader(path,Encoding.UTF8))
{
int count = 0;
int summe = 0;
while ((line = file.ReadLine()) != null)
{
string[] csvItems = line.Split(new char[] { ';' });
count++;
if (count == 1)
{
}
int name;
if (int.TryParse(csvItems[0], out name))
{
Name = name;
}
DateTime date;
if (DateTime.TryParse(csvItems[1], out date))
{
Date1 = date;
}
int stacks;
if (int.TryParse(csvItems[8], out stacks))
{
Stacks = stacks;
summe += Stacks;
}
}
}
}
LG Marcel
// EDIT: Schaffst du es denn schon, eine CSV-Datei einzulesen?
Ja, das habe ich bereits geschafft.
Wozu die Pfad-Ermittlung zu Beginn der Methode? Ich dachte, du hast die Pfade bereits und möchtest eine spezielle CSV-Datei einlesen?
Korrekter wäre doch hier, das geklickte ListView-Item zu verwenden.
string path = myListView.SelectedItems[0].Text;
Auch halte ich es für unglücklich, ein ListView für die Ausgabe der CSV-Datei zu verwenden. Bietet sich hier nicht eher ein DataGridView an? Vorteil: Du kannst aus den Zeilen deiner CSV Objekte oder DataRows erstellen und eine Collection/DataTable direkt an das DataGridView binden.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
In einem CSV kann aber auch im Text ein ";" vorkommen, dann funktioniert dein Einlesen nicht mehr richtig.
Nimm zum Einlesen besser den TextFieldParser. Dazu must du mit using Microsoft.VisualBasic.FileIO mit einbinden.
Dann kannst du auch ganz einfach auf die Daten zugreifen.
Wozu die Pfad-Ermittlung zu Beginn der Methode? Ich dachte, du hast die Pfade bereits und möchtest eine spezielle CSV-Datei einlesen?
Die Pfad Ermittlung wird benötigt, da mindestens einmal im Monat eine neue Datei hinzugefügt wird und diese dann automatisch in der Liste eingetragen werden sollen.
In einem CSV kann aber auch im Text ein ";" vorkommen, dann funktioniert dein Einlesen nicht mehr richtig.
Nein, in meinem File gibt es nur Dateien die durch eine andere Software immer mit einen ";" getrennt werden. Es ist zu 100% sicher, dass dadurch keine Fehler auftreten.
Trotzdem danke! 🙂
Die Pfad Ermittlung wird benötigt, da mindestens einmal im Monat eine neue Datei hinzugefügt wird und diese dann automatisch in der Liste eingetragen werden sollen.
Das tust du aber an der Stelle garnicht und hat an der Stelle auch garnichts verloren. Die Ermittlung der vorhandenen CSV-Dateien gehört nicht zu der Funktion zum Anzeigen der Daten aus einer gewählten CSV-Datei.
Korrekt wäre hier:1.Ermittlung der CSV-Dateien im angegebenen Ordner (Wenn das wirklich so ganz wichtig ist, dann mit einem Timer zyklisch einlesen, ansonsten bei Button-Click). 1.Bei Auswahl einer CSV-Datei: Lesen genau dieser Datei und Anzeige der Daten
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Es ist zu 100% sicher, dass dadurch keine Fehler auftreten.
Zu 100% sicher ist nur, dass es zu einem Zeitpunkt x passieren wird 😁
Schau dir mal FileHelpers.Net an.
using (StreamReader file = new StreamReader(path: FileView.SelectedItems, Encoding.UTF8))
path: FileView.SelectedItems
Kann ich das irgendwie mit einer Variable zuweisen? Das ist im Moment das einzige Problem das ich habe.
Vielen Dank!
LG Marcel
Ich habe jetzt eine Weile hin und her überlegt, wie man's am besten erklärt. Die Sache von dem, was man deinem geposteten Code entnehmen kann, ist die: viel zu aufwändig, unnötig komplex, nicht entkoppelt. Das könnten wir jetzt Stück für Stück auseinandernehmen und korrigieren, ich glaube aber, der Lerneffekt wäre minimal, und das Ergebnis auch nicht so pralle.
Daher anbei ein kleines Projekt, an dem du dich, wenn du willst, orientieren kannst. Zumindest die Grundprinzipien vom Parsen und der Trennung von Logik und Benutzeroberfläche mittels Databinding kannst du dir dort abschauen.
Vor dem Testen im Program.cs den Pfad eintragen, wo deine CSV liegen, oder ggf den Controller anpassen, wenn die Dateien verstreut auf der Platte sind.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Versuche bitte die beiden Schritte - Einlesen der CSV-Liste und Einlesen einer CSV-Datei - gedanklich und codeseitig zu trennen.
Der erste Schritt ist das Einlesen der CSV-Liste. In diese Liste packst du die Pfade zu den CSV-Dateien.
Der zweite Schritt ist das Einlesen einer CSV-Datei. Hier nutzt du schon richtigerweise das SelectedIndexChanged-Event. Mit diesem Index kannst du auf deine Liste zugreifen und den Pfad auslesen, den du dann im StreamReader nutzt.
Das Problem dass du momentan hast, ist eher, dass du die beiden Aufgaben vermischt. =)
EDIT: Und den Post von LaTino berücksichtigen. 😉
Versuche bitte die beiden Schritte - Einlesen der CSV-Liste und Einlesen einer CSV-Datei - gedanklich und codeseitig zu trennen.
Der erste Schritt ist das Einlesen der CSV-Liste. In diese Liste packst du die Pfade zu den CSV-Dateien.
Der zweite Schritt ist das Einlesen einer CSV-Datei. Hier nutzt du schon richtigerweise das SelectedIndexChanged-Event. Mit diesem Index kannst du auf deine Liste zugreifen und den Pfad auslesen, den du dann im StreamReader nutzt.
Das Problem dass du momentan hast, ist eher, dass du die beiden Aufgaben vermischt. =)
EDIT: Und den Post von LaTino berücksichtigen. 😉
Ok, ich werde es mal probieren Themenweisen zu trennen.
(Wäre es hilfreich, wenn ich den kompletten Code posten würde?)
LG Marcel
Wenn wirklich während der Laufzeit des Programms neue Dateien dazukommen können, kannst du im Controller einfach einen FileSystemWatcher o.ä. verbauen und entsprechend die Liste der Dateien neu aufbauen. Wenn einmal im Monat da was dazukommt, halte ich das aber für Usninn.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Hallo,
auch ich hatte eben ein kleines Beispielprojekt angelegt wie ich das angehen würde. Das findest du im Anhang.
Bei mir ist das Beispiel denke ich noch etwas minimaler und Fehleranfälliger als bei LaTino.
Nach Eingabe eines Pfads werden in meinem Beispiel durch Button-Click alle CSV-Dateien im Pfad ermittelt. Nach Auswahl einer Datei wird diese dann in einem DataGridView angezeigt.
Mein Beispiel setzt jedoch vorraus, dass in der ersten Zeile der CSV-Datei jeweils die Bezeichner für die einzelnen Werte stehen.
// EDIT: Das wichtigste in meinem Code ist ohnehin die Klasse CSVReader.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
(Wäre es hilfreich, wenn ich den kompletten Code posten würde?)
Möglich. Ich für meinen Teil schalte geistig schon ab, wenn ich Programmlogik in den Ereignis-Methoden im Code-Behind der Form sehe. Hat da nix verloren; aber das meinte ich: ich sehe kein großes Potenzial darin, deinen vorhandenen Code Stückchen für Stückchen zu verbessern, weil da gleich mehrere Ansätze falsch sind. Ohne dir auf den Schlips treten zu wollen 😉.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
using (StreamReader file = new StreamReader(path: FileView.SelectedItems, Encoding.UTF8))
path: FileView.SelectedItems
Kann ich das irgendwie mit einer Variable zuweisen? Das ist im Moment das einzige Problem das ich habe.
//EDIT: Ich bekomme wenn ich das so verwende wie oben beschrieben die Fehlermeldung:
"Die Spezifikation für benannte Argumente müssen nach Angabe aller festen Argumente angezeigt werden." Fehlercode: CS1738
Um das zu beantworten, müsste man deine Frage genau verstehen. Das tu ich aber tatsächlich nicht.
FileView.SelectedItems ist aus meiner Sicht auch ganz einfach mal nicht korrekt.
Was du willst sofern ich dich richtig verstehe ist:
string myPath = FileView.SelectedItems[0].Text;
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Um das zu beantworten, müsste man deine Frage genau verstehen. Das tu ich aber tatsächlich nicht.
FileView.SelectedItems ist aus meiner Sicht auch ganz einfach mal nicht korrekt.
Also: Es geht darum ich habe 2 ListViews, eine Links die andere Rechts platziert.
Die Linke ListView zeigt mir alle .csv Dateien an. (das funktioniert soweit)
Aber wenn ich auf eine der angezeigten Dateien klicke, sollte auf der rechten ListView der Inhalt der geklickten .csv Datei angezeigt werden, das funktioniert leider nicht. Man soll also durch ein Klick einer der Items den Inhalt öffnen können, diese wird dann in die rechte ListView eingetragen.
P.s: bin noch ein Anfänger, deshalb weis ich nicht wirklich wie manches funktioniert.
Dein (linker) Listview sollte als DataSource eine Liste von Objekten haben. Gleichzeitig sollte seine Eigenschaft "SelectedValue" per Databinding an einer Eigenschaft eines steuernden Objekts gebunden sein. Das aktuell ausgewählte Objekt der Liste links entnimmst du dann eben jener gebundenen Eigenschaft. Das SelectedIndex-Gefuchtel solltest du ganz schnell wieder vergessen.
Was du machst:
"wenn der Benutzer HIER klickt, mache ich das. Ändert er DORT etwas, muss ich so reagieren."
Das ist nicht mehr zu verwalten, weil daraus früher oder später so etwas hier wird:
"wenn der Benutzer DORT klickt, vorher DAS da angehakt hat, in der Konfiguration im Wert XY etwas steht und die Venus im Schützen steht, DANN mach ich das" - kein Mensch inklusive dir selbst versteht dann noch, was da passiert.
Was du machen solltest:
"Form, deine Liste von CSV-Dateien steht da im Objekt 'Controller'. Und bitte das, was auch immer grad in dieser Liste ausgewählt ist, ebenfalls mit dem Objekt abgleichen. Danke."
Hier der komplette Code, der notwendig ist, um das aktuell ausgewählte Objekt zu identifzieren:
_fileListBox.DataBindings.Add("SelectedValue", _controller, "SelectedFile", false, DataSourceUpdateMode.OnPropertyChanged);
...und wenn du das stattdessen im Designer zusammenklickst, was auch geht, dann verschwindet sogar diese eine Zeile noch.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
using (StreamReader file = new StreamReader(path: FileView.SelectedItems, Encoding.UTF8))
Welche Variable muss dann für den Pfad gegeben werden?
Hast du mal in das Projekt geschaut, was ich gepostet habe? Werd' den StreamReader los.
LaTino
EDIT: in dem Fall oben hast du jederzeit auf Controller.SelectedFile.File zugriff, das vom Typ FileInfo ist. Folgender Schnippsel liefert dir dann also alle Zeilen bis auf die erste, die in der Datei stehen:
string[] allLines = File.ReadAllLines(controller.SelectedFile.File.FullName).Skip(1); //Skip: erste Zeile überspringen
Anwendung steht auch in MainController.cs, letzte Zeile. Da wird direkt geparst.
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)