none
Textbox während dateieinlesung befüllen RRS feed

  • Frage

  • Hallo, ich habe ein kleines GUI Programmert, welches anfangs Diverse Dateien einliest.

    Nun möchte ich gerne, dass während des Einlesens eine Textbox ausgibt, was gerade eingelesen wird. wenn ich allerdings textbox.text = .... eingebe, dann erscheint dieser text imer erst, wenn das einlesen der kopletten daten erledigt ist, also zwischedurch pasiert an der textbox garnichts.

    Kann mir da jemand weiter helfen?

    Samstag, 16. März 2013 20:36

Antworten

  • Hallo,

    das einlesen musst du in einen 2. Thread verschieben. Stichwort BackgroundWorker. Somit wird sich die GUI auch aktualisieren wenn du den Text zuweist. Dafür brauchst du die Methode BeginInvoke:

            public Form1()
            {
                InitializeComponent();
                bw.DoWork += bw_DoWork;
            }
    
            void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                this.BeginInvoke(new UpdateDelegate(() =>
                    {
                        textBox1.Text = "Hello World!";
                    }));
            }
    
            BackgroundWorker bw = new BackgroundWorker();
    
            delegate void UpdateDelegate();
    
            private void button1_Click(object sender, EventArgs e)
            {
                bw.RunWorkerAsync();
            }


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    Samstag, 16. März 2013 21:38

Alle Antworten

  • Hallo,

    das einlesen musst du in einen 2. Thread verschieben. Stichwort BackgroundWorker. Somit wird sich die GUI auch aktualisieren wenn du den Text zuweist. Dafür brauchst du die Methode BeginInvoke:

            public Form1()
            {
                InitializeComponent();
                bw.DoWork += bw_DoWork;
            }
    
            void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                this.BeginInvoke(new UpdateDelegate(() =>
                    {
                        textBox1.Text = "Hello World!";
                    }));
            }
    
            BackgroundWorker bw = new BackgroundWorker();
    
            delegate void UpdateDelegate();
    
            private void button1_Click(object sender, EventArgs e)
            {
                bw.RunWorkerAsync();
            }


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    Samstag, 16. März 2013 21:38
  • also ich will ja in dem Code, der ausgeführt wird um die Dateien einzulesen die textbox befüllen.

    Wenn ich den code nun im backgroundworker einfüge, dann meckert der, weil die textbox aus einem nicht zugelassenen thread beschrieben werden soll.

    Samstag, 16. März 2013 23:40
  • Dafür brauchst du eben die BeginInvoke-Methode...
    Sieh mal in meinen Code, der Zugriff auf die TextBox erfolgt über diese.

    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    Sonntag, 17. März 2013 00:20
  • Hi,

    der BackgroundWorker bietet einen event an -> "ProgressChanged" (WorkerReportsProgress auf true setzen) und aus dem DoWork dann aufrufen mit ReportProgress, wenn Du texte ausgeben möchtest mittels des overloads das ein userState object als parameter nutzt:

    http://msdn.microsoft.com/de-de/library/a3zbdb1t.aspx

    Viele Grüße,

      Thorsten

    Sonntag, 17. März 2013 04:36
  • Hallo Bensen83,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,
    Ionut

    Donnerstag, 28. März 2013 14:55