Laden...

doppelter SaveFileDialog Aufruf --> Exception

Erstellt von Ricane vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.151 Views
R
Ricane Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren
doppelter SaveFileDialog Aufruf --> Exception

Hallo zusammen,

ich habe ein Problem mit einem SaveFileDialog, der bei einem zweiten Aufruf eine Exception auslöst, welchen ich mir nicht so recht erklären kann. Da ich noch relativ neu in dieser Programmiersprache bin (musste aus beruflichen Gründen auf diese umschwenken; habe zuvor viele Jahre Delphi programmiert) hoffe ich hier auf eine Antwort die mir die Suchfunktion leider nicht geboten hat 😉

Folgender Code funktioniert beim ersten Aufruf hervorragend:

                saveFileDialog1.FileName = dataGridView1.Rows[lstVideos.SelectedIndex].Cells[6].Value.ToString();
                if ( saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    if (i_act_downs[i_int_actual_download].wc == null)

Sobald dieser aber ein zweite mal durchlaufen wird (es handelt sich um ein Tool welches Dateien simultan herunterlanden soll), wird die Exception "Ein Aufrufziel hat einen Ausnahmefehler verursacht." geworfen.

Beim debuggen fällt auf, das der ShowDialog() Befehl nicht sofort, wie erwartet, das Fenster öffnet sondern erst das "DownloadProgressChanged" Event vom WebClient gerufen wird; sobald dieses Event dann durchlaufen ist, tritt die Exception auf.

Beste Grüsse,

Ricane

I
302 Beiträge seit 2008
vor 15 Jahren

was passiert denn im event? hast du vielleicht noch mehr code?

R
Ricane Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren

was passiert denn im event? hast du vielleicht noch mehr code?

In diesem Event wird eigentlich zum größten Teil nur die Anzeige (Empfangene Dateimenge, etc. aufgefrischt), was das ganze schon etwas mysteriös macht. Ich will jetzt nicht den Post hier mit Code fluten... das hier ist eigentlich die Quintessenz:

            i_act_downs[i_int_actual_download].total_size = e.TotalBytesToReceive;
            i_act_downs[i_int_actual_download].actual_size = e.BytesReceived;

            dbl_totalsize = Math.Round((Convert.ToDouble(e.TotalBytesToReceive) / 1024), 2);
            dbl_recieved = Math.Round((Convert.ToDouble(e.BytesReceived) / 1024), 2);

            if (dbl_totalsize > 1024)
            {
                dbl_totalsize = Math.Round(dbl_totalsize / 1024, 2);
                s_extension_total = " mb";
            }
            if (dbl_recieved > 1024)
            {
                dbl_recieved = Math.Round(dbl_recieved / 1024, 2);
                s_extension_rec = " mb";
            }

            ls_controlname = "lbSize" + i_int_actual_download.ToString();
            Control[] lblActuallabel = this.Controls.Find(ls_controlname, true);
            (lblActuallabel[0] as Label).Text = dbl_totalsize.ToString() + s_extension_total;

            ls_controlname = "lbReceived" + i_int_actual_download.ToString();
            Control[] lblActuallabel1 = this.Controls.Find(ls_controlname, true);
            (lblActuallabel1[0] as Label).Text = dbl_recieved.ToString() + s_extension_rec;

            ls_controlname = "lbPercent" + i_int_actual_download.ToString();
            Control[] lblActuallabel2 = this.Controls.Find(ls_controlname, true);
            (lblActuallabel2[0] as Label).Text = e.ProgressPercentage.ToString() + "%";

            ls_controlname = "prgDownload" + i_int_actual_download.ToString();
            Control[] lprgbar = this.Controls.Find(ls_controlname, true);
            (lprgbar[0] as ProgressBar).Value = e.ProgressPercentage;

Das sollte doch eigentlich auf den SaveFileDialog keinen Einfluss nehmen...

Beste Grüsse,

Ricane

I
302 Beiträge seit 2008
vor 15 Jahren

an dem oberen code kann dies eigentlich nicht liegen

R
Ricane Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren

Habs jetzt hinbekommen... danke für Deine Hilfe 😉

I
302 Beiträge seit 2008
vor 15 Jahren

dann hast du es aber alleine hinbekommen 😃
konnte ja nicht wirklich helfen. dann viel erfolg

J
3.331 Beiträge seit 2006
vor 15 Jahren

Hallo und noch willkommen,

Habs jetzt hinbekommen...

Und wie? Das wäre für weitere Leser (wie mich) ganz nützlich zu wissen.

Mir scheinen außerdem mehrere Punkte mysteriös bzw. unpraktisch oder ungeeignet zu sein.

Du greifst auf Zellen des **DataGridView **zu. Das ist meistens unpassend. Besser ist es, die dahinterliegenden Daten , i.d.R. DataTable zu benutzen. Das DGV dient zur Anzeige (und manuellen Bearbeitung) und "blockiert" GUI-Ressourcen.

Was hat das **DownloadProgressChanged **mit dem Dialog zu tun? Ich habe den Eindruck, dass sich die beiden Maßnahmen ins Gehege kommen.

Auch solltest Du die Formatierungen noch überarbeiten. Convert.ToDouble ist überflüssig. Es geht einfacher:

double result = e.TotalBytesToReceive) / 1024.0;

Statt Zahl.ToString und String-Verknüpfung gibt es String.Format; das ist für so etwas gedacht.

Warum willst Du die Controls bei jedem Aufruf dieses Ereignisses per Controls.Find suchen? Leg sie doch einmal am Anfang fest und benutze dann die hier genannten Variablen.

Gruß Jürgen

R
Ricane Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren

Hallo und noch willkommen,

Habs jetzt hinbekommen...
Und wie? Das wäre für weitere Leser (wie mich) ganz nützlich zu wissen.

[...]

Das Problem lag viel mehr daran das die instanzvariable die das struct i_act_downs ansprach einen zu hohen wert aufwies.

Wieso der Fehler an der Stelle mit dem SaveFileDialog dann auftrat, ist mir persönlich nicht ganz klar.

PS: Danke für Deine Tipps bzgl. Konvertierrung/Datenhaltung; ich werde mich mit dem Thema noch weiter auseinander setzen.

Beste Grüsse,

Ricane