Hallo CSharp Forum!!!
Ich habe mich dazu entschieden Programmieren zu lernen was ja an und für sich gut ist 👅
Nur stoße ich immer wieder auf Hindernisse, dieses mal wäre super wen ihr mir helfen könnt. 😁
Und zwar habe ich 2 Listen erstellt die eine Textdatei einlesen, Telefonnummer und Name.
Die Listen sollen dann verzögert und einzeln in 2 Textboxen ausgegeben werden.
Das auslesen klappt leider nicht
public void datei()
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
string pfad = ofd.FileName;
}
var spalte1 = new List<string>();
var spalte2 = new List<string>();
StreamReader reader = new StreamReader(ofd.FileName);
while (!reader.EndOfStream)
{
var splits = reader.ReadLine().Split(';');
spalte1.Add(splits[0]);
spalte2.Add(splits[1]);
//Thread.Sleep(5000);
//txt_An.Text = "";
//txt_Nachricht.Text = "";
}
for (int x = 0; x < spalte1.Count; x++)
{
txt_An.Text = (spalte1[x]);
}
for (int y = 0; y < spalte2.Count; y++)
{
txt_Nachricht.Text = (spalte2[y]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Das ganze ist für WebSMS gedacht, also Eintrag 1 einfügen in Textboxen senden, Textboxen leeren, Eintrag 2 Einfügen sende, usw....
Bei dem einfügen beiße ich mir gerade die Zähne aus X( X(
Danke euch schon mal im voraus!! 👍 👍 👍
Schöne Grüße
Manfred
Hi Manfred,
Das auslesen klappt leider nicht
Manfred
Doch da kann ich dich schonmal beruhigen, das klappt super.
Aber wie kommst du darauf, dass das ganze verzögert passieren sollte und nicht sofort die letzten Einträge angezeigt werden in den Textboxen?
Computer sind schnell.
mach mal
txt_An.Text += (spalte1[x]) + "\r\n";
ist zwar sehr uneffizient ... aber fürs erste...
(für Texte zusammenführen besser "StringBuilder" verwenden. oder...)
(für "\r\n" besser "Environment.NewLine" verwenden. oder...)
Edit: ..und mach mal:
txt_An.Multiline = true;
txt_An.WordWrap = false;
txt_An.ScrollBars = ScrollBars.Both;
Hiho,
danke für die schnellen antworten!!! 👍
@Buchstabensuppe
Damit man sieht an wen man gerade eine SMS sendet. Es könnten ja 20 oder mehr Empfänger in der Datei stehen
@CoLo
Werde ich später gleich probieren, dann muss ich aber eine Schleife beim senden machen 🤔
Berichte dann auch wie funktioniert!! 😁 😁
Schöne Grüße
Manfred
Ne, ich meinte dass du einfach nicht so schnell gucken kannst wie dein PC das macht...
Das passt eigentlich schon... da steht zuerst der 1. dann der 2. und dann der 3. Name in der Textbox.
Und erst den 3. siehst du dann, weil es so schnell geht.
Mach mal ein
System.Diagnostics.Debug.WriteLine(txt_An.Text.ToString());
in deiner for() Schleife von spalte1 und guck in den Debugger, dann siehst du das. Die 3 Werte werden da reingeschrieben!
edit: Ich persönlich würde das einfach über einen Timer machen, der alle 5 Sekunden feuert und dann die Textbox aktualisieren.
Deine beschriebene Anforderung ist leider etwas unverständlich für mich.
Ich habe es so verstanden:
Du hast eine Textdatei welche pro Zeile eine Telefonnummer und eine Nachricht, getrennt mit einem Semikolon, enthält.
Du möchtest diese in dein Programm einlesen und anschließend einzeln und nur nach Bestätigung eines Benutzers exakt diese eine Nachricht versenden.
Nach dem Versenden der Nachricht, soll die nächste Nachricht in deiner eingelesen Liste für den Benutzer angezeigt werden und wieder soll der Benutzer die Sendung der Nachricht bestätigen.
Soweit alles korrekt?
Ein paar Tipps zu deinem vorhandenen Code:
*Lass deinen Code von VisualStudio formatieren, sonst liest sich dein Code für Außenstehende sehr schwer. (siehe Einrückung der zweiten for-loop)
*Benutze eine Klasse um die Datenfelder (Telefonnummer, Nachricht) zu kapseln.
*Benutze das Schlüsselwort using
für deinen StreamReader, damit automatisch Dispose()
nach Verwendung aufgerufen wird. (siehe IDisposable Interface (System))
*Logikfehler: Deine beiden Schleifen werden nicht zeitgleich ausgeführt, d.h. du iterierst durch alle Empfänger und erst dann durch alle Nachrichten.
Hallo zusammen,
Danke Buchstabensuppe für die Idee mit dem Timer, hab zwar knapp 45 mins gebraucht aber jetzt klappt es 😁 😁
@dannoe
Ja genau so meinte ich das, so wie es gerade funktioniert mit dem Timer gefällt mir das auch ganz gut.
Danke für die Tipps werde versuchen die in Zukunft zu verwenden
Danke an euch alle für die Hilfe 👍 👍 👍
Schöne Grüße
Manfred
PS: Mein Code ist wieder mal ganz grün geworden 😁 😁
Schön 👍
Beachte bitte trotzdem die Tipps von dannoe.
Zumindest im Hinterkopf.
Hallo zusammen !!!
Habe an meinem kleinen Programm weiter gemacht, ich bekomme am ende des einlesen einen Fehler > Fehlermeldung:
" Der Index war Außerhalb des Arraybereichs"
Wie kann ich das Prüfen ob die Datei zu Ende ist und aus der Schleife springen soll?
So funktioniert es auch nicht " while ((line = reader.ReadLine()) != null)"
public void ausDatei()
{
try
{
using (StreamReader reader = new StreamReader(pathFile))
{
while (!reader.EndOfStream)
{
var splits = reader.ReadLine().Split(';');
spalte1.Add(splits[0]);
spalte2.Add(splits[1]);
spalte3.Add(splits[2]);
}
reader.Close();
}
MessageBox.Show("Datei erfolgreich Importiert!!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Schöne Grüße
Manfred
Sieht die letzte Zeile anders aus als der Rest?
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
[Edit]
Tipp: Der Fehler bezieht sich auf nen Index und es kommt ein ungeprüfter (bzw. nach Prüfung) Split + Index-Zugriff in dem Code vor
[/Edit]
Hallo Manfred82,
So funktioniert es auch nicht " while ((line = reader.ReadLine()) != null)"
bist du sicher?
https://msdn.microsoft.com/en-us/library/db5x7c0d(v=vs.100).aspx
while ((input = sr.ReadLine()) != null)
Es gibt auch die File.ReadAllLines-Methode
Ich behaupte eher, dass es knallt, wenn du auf den Index 0,1 oder 2 zugreifst. 😉 Benutze, wie schon beschrieben, den [Artikel] Debugger: Wie verwende ich den von Visual Studio?
-- Edit: Jamikus hats schon gesagt, hatte den Edit übersehen.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hallo,
habe es auch so versucht
public void ausDatei()
{
try
{
using (StreamReader reader = new StreamReader(pathFile))
{
do
{
var splits = reader.ReadLine().Split(';');
spalte1.Add(splits[0]);
spalte2.Add(splits[1]);
spalte3.Add(splits[2]);
}
while (reader.Peek() != -1);
{
reader.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
ist aus diesem Artikel [Tutorial] Dateioperationen: Alles über Dateien 2.2
@Coffeebean
Ja bin ich mir, da bekomme ich die selbe Fehlermeldung
Beim Debuggen steht dann, siehe Anhang
Schöne Grüße
Manfred
btw.: [Tutorial] Dateioperationen: Alles über Dateien 2.2
Versteife dich nicht auf das Ende der Textdatei.
Wenn man im Screenshot sieht, dass Spalte 1 zwei Elemente hat und Spalte 2 nur eins.
Kann man daraus resultieren: Fehlende Validierung = Fehler
Deine zweite Zeile hat demnach nur ein Element nach dem Split. Dennoch versuchst du mehr als ein Element zu benutzen. Dies ergibt den
Hallo Manfred82,
das steht sowohl in Jamikus' Antwort und in meiner. Nimm bitte den [Artikel] Debugger: Wie verwende ich den von Visual Studio? (der jetzt zum dritten (!) mal verlinkt ist) und [Hinweis] Bitte schau in die SDK-/MSDN-Doku um das mit dem Array und dem Index zu lernen.
Ich hab den Ausschnitt/Link nur gepostet um zu sagen, dass es da nicht dran liegen kann.
Du hast ein Array mit 2 Feldern und greifst auf das dritte zu. Das knallt eben.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hallo,
hab jetzt einfach mal die zu einlesende Datei neu erstellt, und siehe da es funktioniert.
Danke für die Antworten von euch!!! 👍
Schöne Grüße
Manfred 😁
Hallo Manfred82,
hast du wirklich verstanden, warum es geknallt hat? Array-Index und so weiter...
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hey Coffeebean,
ich glaube ja, weil er den Index um eines hochgezählt hat obwohl spalte2 leer war bzw. Leerzeichen in spalte1.
Gruss Manfred