Hallo zusammen,
habe da ein kleines Problem, bei dem ich nicht weiter komme. Ich möchte zwei Dateien auslesen und sie dann nachher in zwei verschiedene DataGridview anzeigen lassen. Ich gehe folgendermassen vor: Ich öffne über eine openfiledialog zwei dateien aus. Über getdata() gelange ich dann in die Klasse wo die Dateien ausglesen werden.
fileNames = openFileDialog1.FileNames;
foreach (string fileName1 in fileNames)
{
fileName = fileName1;
getData();
}
Das auslesen klappt ja auch wunderbar, nur wird mir immer nur eine Datei ausgegeben. Ist ja im Grunde auch klar, da die erste Datei wieder überschreiben wird, wenn die zweite gelesen wird. Hat jemand eine Idee, wie man das lösen könnte, oder muss ich die beiden Dateien in zwei unterschiedliche Klassen übergeben?
Wäre schön wenn mir einer dabei helfen könnte oder mir ein Tipp geben kann wie man das am besten lösen kann🙂
MfG
hi,
für dein Problem ist das von dir gepostetet CodeSnippet ziemlich irrelevant. Soll heißen, es hängt davon ab, was du in getData machst!
Prinzipiell könntest du getData() ja den dateinamen mitübergeben und die Informationen aus der Datei auslesen und anzeigen.
Ich glaube eher, dass er die Dateien im Array ansprechen will. Da es ja immer nur 2 Dateien sind, kannst du das wohl hard codieren.
//Der erste Eintrag im Array
openFileDialog1.FileNames[0];
//Der zweite Eintrag im Array
openFileDialog1.FileNames[1];
Jetzt kannst du ja die ausgewählten Dateien ansprechen und die dann ins datagrid laden.
heute code ich, morgen debug ich und übermorgen cast ich die königin auf int
hi nin,
sorry, stimmt natürlich. In getdata() hole ich mir die beiden Tabellen aus der Klasse
private void getData()
{
switch(fileName.Substring(fileName.Length - 3).ToString().ToLower())
{
case "csv":
{
td.td_auslesen(fileName);
dataGridView1.DataSource = td.Teile1;
dataGridView2.DataSource = td.Dispo1;
break;
}
}
}
Weiß zwar nicht ob es weiterhilft, ich denke mal schon. Hier ist dann nochmal die Klasse in der ich die Dateien auslese.
private void auslesen(string fileName)
{
DataTable Teile = new DataTable("TeileTabelle");
DataTable Dispo = new DataTable("DispoTabelle");
string word = "";
char[] deli = new char[] { ';' };
if (File.Exists(fileName.Substring(0, fileName.Length - 4) + ".csv"))
{
fileName = fileName.Substring(0, fileName.Length - 4) + ".csv";
}
StreamReader sr = new StreamReader(fileName);
word = sr.ReadLine();
if (word.Split(deli).Length <= 14)
{
string[] ersteZeile = word.Split(';');
foreach (string strSpalte in ersteZeile)
{
Teile.Columns.Add(strSpalte, typeof(string));
}
while ((word = sr.ReadLine()) != null)
{
//if (word.Split(deli).Length <= 14)
//{
string[] ersteZeile1 = word.Split(';');
DataRow zeile = Teile.NewRow();
for (int i = 0; i < ersteZeile1.Length; i++)
{
for (int j = 0; j < ersteZeile.Length; j++)
{
zeile[j] = ersteZeile1[i];
i++;
}
}
Teile.Rows.Add(zeile);
//}
}
}
else
{
string[] ersteZeile = word.Split(';');
foreach (string strSpalte in ersteZeile)
{
Dispo.Columns.Add(strSpalte, typeof(string));
}
while ((word = sr.ReadLine()) != null)
{
//if (word.Split(deli).Length <= 14)
//{
string[] ersteZeile1 = word.Split(';');
DataRow zeile = Dispo.NewRow();
for (int i = 0; i < ersteZeile1.Length; i++)
{
for (int j = 0; j < ersteZeile.Length; j++)
{
zeile[j] = ersteZeile1[i];
i++;
}
}
Dispo.Rows.Add(zeile);
//}
}
}
//sr.Close();
Teile1 = Teile;
Dispo1 = Dispo;
sr.Close();
}
Gehe ich denn überhaupt richtig daran? Nicht das ich völlig auf der falschen Spur bin?
MfG
@unclesam:
ich finde die Lösung mit "foreach (file in fileNames)" schon schöner.
am besten gleich direkt:
foreach (string file in openFileDialog1.FileNames)
@myBig?
Aber das eigentliche Problem liegt doch wo anders, oder ??
Habe das Problem gefunden und gelöst. Die Übergabe muss der Variablen müssen in der if-Abfrage geschehen und nicht erst ganz am schluss wie in meinem ersten Eintrag.
private void auslesen(string fileName)
{
DataTable Teile = new DataTable("TeileTabelle");
DataTable Dispo = new DataTable("DispoTabelle");
string word = "";
char[] deli = new char[] { ';' };
if (File.Exists(fileName.Substring(0, fileName.Length - 4) + ".csv"))
{
fileName = fileName.Substring(0, fileName.Length - 4) + ".csv";
}
StreamReader sr = new StreamReader(fileName);
word = sr.ReadLine();
if (word.Split(deli).Length <= 14)
{
string[] ersteZeile = word.Split(';');
foreach (string strSpalte in ersteZeile)
{
Teile.Columns.Add(strSpalte, typeof(string));
}
while ((word = sr.ReadLine()) != null)
{
string[] ersteZeile1 = word.Split(';');
DataRow zeile = Teile.NewRow();
for (int i = 0; i < ersteZeile1.Length; i++)
{
for (int j = 0; j < ersteZeile.Length; j++)
{
zeile[j] = ersteZeile1[i];
i++;
}
}
Teile.Rows.Add(zeile);
}
Teile1 = Teile;//Hier muss die Übergabe geschehen für die Tabelle Teile
}
else
{
string[] ersteZeile = word.Split(';');
foreach (string strSpalte in ersteZeile)
{
Dispo.Columns.Add(strSpalte, typeof(string));
}
while ((word = sr.ReadLine()) != null)
{
string[] ersteZeile1 = word.Split(';');
DataRow zeile = Dispo.NewRow();
for (int i = 0; i < ersteZeile1.Length; i++)
{
for (int j = 0; j < ersteZeile.Length; j++)
{
zeile[j] = ersteZeile1[i];
i++;
}
}
Dispo.Rows.Add(zeile);
}
Dispo1 = Dispo;//Hier muss die Übergabe für Dispo geschehen!!!
}
Auf jeden Fall vielen Dank für die Hilfe!!!
Jetzt werden beide Tabellen gleichzeitig angezeigt🙂
MfG
Wieso übergibst du den Dateinamen nicht als Parameter an getData()? Die Übergabe über eine Instanzvariable ist ... unschön.
Zum Zerlegen des Dateinamens bitte die Klasse System.IO.Path benutzen.
Wozu entfernst du erst die Extension, nur um sie dann wieder hinzuzufügen? Wenn schon nicht die Path-Klasse, dann wenigstens Test mittels String.EndsWith().
Wenn du MultiSelect benutzt, kann der Benutzer beliebig viele Dateien auslesen. Da ist es wenig intuitiv, wenn nur zwei geöffnet werden, vor allem da nicht bestimmt ist, in welcher Reihenfolge sie in FileNames auftauchen.