Laden...

<List> Eintrag versetzt anzeigen in Textbox

Erstellt von Manfred82 vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.219 Views
M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren
<List> Eintrag versetzt anzeigen in Textbox

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

B
88 Beiträge seit 2016
vor 7 Jahren

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.

C
224 Beiträge seit 2009
vor 7 Jahren

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;

M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

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

B
88 Beiträge seit 2016
vor 7 Jahren

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.

D
261 Beiträge seit 2015
vor 7 Jahren

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.

M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

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 😁 😁

B
88 Beiträge seit 2016
vor 7 Jahren

Schön 👍

Beachte bitte trotzdem die Tipps von dannoe.
Zumindest im Hinterkopf.

M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

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

J
251 Beiträge seit 2012
vor 7 Jahren

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]

2.207 Beiträge seit 2011
vor 7 Jahren

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

M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

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

J
251 Beiträge seit 2012
vor 7 Jahren

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

IndexOutOfRangeException

2.207 Beiträge seit 2011
vor 7 Jahren

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

M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

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 😁

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Manfred82,

hast du wirklich verstanden, warum es geknallt hat? Array-Index und so weiter...

Gruss

Coffeebean

M
Manfred82 Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

Hey Coffeebean,

ich glaube ja, weil er den Index um eines hochgezählt hat obwohl spalte2 leer war bzw. Leerzeichen in spalte1.

Gruss Manfred