Autor Beitrag
Marc Dirk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Sa 27.03.10 00:09 
Hallo,

ich habe mal wieder ein Problemchen.
Es scheint so das beim befüllen des DataGridView mit den Daten aus der DataTable jeweils pro Zelle das CurrentCellChanged Event ausgelöst wird.

ausblenden C#-Quelltext
1:
2:
3:
dgvnew.DataSource = dt3;
dgvnew.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
this.Controls.Add(dgvnew);


Kann das sein? Wenn ja, kann man dieses Event für diese Zeit abschalten? (In VBA gibt es hierfür einen Befehl)
In meiner Tabelle befinden sich pro Zeile Pfade zu Produktbildern.
Ich hatte vor das der User durch das navigieren durch die Zellen sich jeweils das Produktbild in einer PictureBox ansehen kann.
Dazu wolle ich mittels CurrentRow den Pfad der entsprechenden Zeile abfragen.

Das klappt nicht und beim Debuggen stellt sich heraus das der abgefragte Pfad jeweils null ist.
Ich vermute das liegt daran das die Tabelle zu diesem Zeitpunkt noch befüllt wird. Kann das sein?

Hier mein Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
private void dgvnew_CurrentCellChanged(object sender, EventArgs e)
        {
            try
            {
                int currentrow = dgvnew.CurrentRow.Index;  //<--- hier taucht der Fehler auf: NullReferenceException wurde nicht behandelt Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
                string myurl = this.dgvnew[23, currentrow].Value.ToString();


                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(new Uri(myurl));
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                Stream resStream = myHttpWebResponse.GetResponseStream();
                Image ProductImage = new Bitmap(this.pictureBox1.Size.Width, this.pictureBox1.Size.Height);
                ProductImage = ((System.Drawing.Image)(Image.FromStream(resStream)));
                this.pictureBox1.Image = ProductImage;
                resStream.Close();
                myHttpWebResponse.Close();

            }
            catch (WebException)
            {
                MessageBox.Show("Fehler");
            }
        }


Zuletzt bearbeitet von Marc Dirk am Sa 27.03.10 22:30, insgesamt 1-mal bearbeitet
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Sa 27.03.10 10:21 
Servus!

Jop, man könnte das Event "deaktivieren". Aber ich denke nicht, dass das sinnvoll wäre und weiß auch nicht, ob das überhaupt was bring.

Ich würed vorschlagen, du überprüfst einfach, ob CurrentRow null ist:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
            try
            {
                if(dgvnew.CurrentRow != null)
                {
                     int currentrow = dgvnew.CurrentRow.Index; 
                     .
                     .
                     .
                }  

            }
            catch (WebException)
            {
                MessageBox.Show("Fehler");
            }


Um das Event zu deaktivieren, musst du es einfach so wie bei der Registrierung machen:

ausblenden C#-Quelltext
1:
dgvnew.CurrentCellChanged -= new EventHandler(dgvnew_CurrentCellChanged);					
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 27.03.10 10:53 
Hallo,

du kannst auch noch versuchen, ob SuspendLayout das CellChanged umgeht. Ansonsten schließe ich mich Normans Antwort an.

Jürgen
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Sa 27.03.10 22:22 
Hallo Norman,

jetzt hast Du mir schon wieder richtig weiter geholfen. Ich danke Dir!

Es war tatsächlich so wie ich vermutet habe und das Abschalten des Events zum Zeitpunkt des Form1_Activated Event und das Wiedereinschalten nach der Befüllung der Tabelle hat funktioniert.

Der Vorteil des Abschaltens gegenüber der Abfrage auf Null ist die Befüllzeit der Tabelle. Um nur 1200 Bilder aus dem Netz abzufragen bzw. zu laden dauert es rund 2 Minuten (ca. 100ms/Bild), die ich mir spare in dem ich nach dem Befüllen der Tabelle nur das Bild abfrage, das ich gerade sehen will. Da sich beim Befüllen der Tabelle jeweils die CurrentCell ändert, würde die Internetabfrage 1200 Zeilen mal 24 Spalten (=28800) mit jedem Event abgefragt werden. Wie oben geschrieben dauern 1200 Bilder rund 2 Minuten, das bedeutet bei 28800 zugriffen eine Ladezeit von rund 48 Minuten.

Also, Dir nochmal vielen Dank!

Marc
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Sa 27.03.10 22:28 
Danke!
Ich habe es nicht mehr probiert,
würde aber vermutlich, so weit ich nun darüber gelesen habe, auch funktionieren.
Es ist auf jeden Fall gut zu wissen´, dass es so eine Methode gibt.
Gruß
Marc
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: So 28.03.10 05:31 
Immerwieder gern:)