Laden...

Mit einem Foreach in einem Datagridview über alle Rows iterieren

Erstellt von romu2000 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.835 Views
R
romu2000 Themenstarter:in
291 Beiträge seit 2006
vor 5 Jahren
Mit einem Foreach in einem Datagridview über alle Rows iterieren

Hallo,

leider bekomme ich es nicht hin meinen Code entsprechend autmatisiert über eine foreach Schleife laufen zu lassen:


private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
           DataRow row = ((DataRowView)dataGridView1.Rows[e.RowIndex].DataBoundItem).Row;

            
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://test.da?" + row[4].ToString());
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))


            {
                var result = streamReader.ReadToEnd();
                textBox1.Text = result.ToString();
            }

            
                if (textBox1.Text.Contains("666666"))
                {
                    textBox3.Text = "Test";
                    dataGridView1[6, e.RowIndex].Style.BackColor = Color.Green;
                }
                else
                {
                    textBox3.Text = "Nein";
                    dataGridView1[6, e.RowIndex].Style.BackColor = Color.Red;
                }

                if (textBox1.Text.Contains("55555"))
                {
                    textBox3.Text = "Test";
                    dataGridView1[7, e.RowIndex].Style.BackColor = Color.Green;
                }
                else
                {
                    textBox3.Text = "Nein";
                    dataGridView1[7, e.RowIndex].Style.BackColor = Color.Red;
                }

                if (textBox1.Text.Contains("44444"))
                {
                    textBox3.Text = "Test";
                    dataGridView1[8, e.RowIndex].Style.BackColor = Color.Green;
                }
                else
                {
                    textBox3.Text = "Nein";
                    dataGridView1[8, e.RowIndex].Style.BackColor = Color.Red;
                }

                if (textBox1.Text.Contains("3333"))
                {
                    textBox3.Text = "Test";
                    dataGridView1[9, e.RowIndex].Style.BackColor = Color.Green;
                }
                else
                {
                    textBox3.Text = "Nein";
                    dataGridView1[9, e.RowIndex].Style.BackColor = Color.Red;
                }

                if (textBox1.Text.Contains("xy"))
                {
                    textBox3.Text = "Test";
                    dataGridView1[11, e.RowIndex].Style.BackColor = Color.Black;
                }
                else
                {
                    textBox3.Text = "Nein";
                    dataGridView1[11, e.RowIndex].Style.BackColor = Color.Red;
                }

                if (textBox1.Text.Contains("xxxxxxxxxx") || textBox1.Text.Contains("Hybrid"))
                {
                    textBox3.Text = "Test";
                    dataGridView1[12, e.RowIndex].Style.BackColor = Color.Green;
                }
                else
                {
                    textBox3.Text = "Nein";
                    dataGridView1[12, e.RowIndex].Style.BackColor = Color.Red;
                }
            


        }

So funktioniert der Code durch klick auf die entsprechende Zelle.

Wie könnte ich das ganze automatisiert alle 10 Sekunden pro Row ausführen lassen?

Packe ich das ganze in eine foreach Schleife bekomme ich die Meldung das eventargs keine definition für e.rowindex enthält...
Welchen enventargs soll ich bei einem klick auf den Button weitergeben???

Über einen Ratschlag wäre ich sehr dankbar.

Beste Grüße

Ronny

H
38 Beiträge seit 2019
vor 5 Jahren

Was soll das Programm denn machen?

T
156 Beiträge seit 2010
vor 5 Jahren

Hi,

Wie könnte ich das ganze automatisiert alle 10 Sekunden pro Row ausführen lassen?

Also automatisiert alle 10 Sekunden, bei einem WebRequest finde ich sehr sportlich.
Mit Threading bestimmt machbar, aber ja:

Was soll das Programm denn machen?

//// edit: Du verwendest doch nie das Result, was Du durch den WebRequest absendest... 🤔

J
251 Beiträge seit 2012
vor 5 Jahren

Packe ich das ganze in eine foreach Schleife bekomme ich die Meldung das eventargs keine definition für e.rowindex enthält...
Welchen enventargs soll ich bei einem klick auf den Button weitergeben???

Ist Dir denn bewusst, was e.RowIndex ist?
Wie hast Du den Schleifenkopf von foreach geschrieben? Auch wenn es mit foreach geht, versuchs notfalls mit einer for-Schleife, um es Dir verständlicher zu machen, was den Index-Zugriff angeht.

F
10.010 Beiträge seit 2004
vor 5 Jahren

Schon die gesamte Herangehensweise ist falsch.

Das DGV ist nur zur Anzeige der Daten, nicht zum Aufbewahren da.

Erstelle eine List<DeineKlasse>, binde diese an WebListDataGridView.DataSource und iteriere durch die Liste, nicht durchs DGV.

4.939 Beiträge seit 2008
vor 5 Jahren

Beachte auch [Artikel] Drei-Schichten-Architektur (Web- wie eben auch Datenbankzugriffe sollten niemals in der UI (bzw. dessen Thread) stattfinden, auch wegen möglichem [FAQ] Warum blockiert mein GUI?)!

R
romu2000 Themenstarter:in
291 Beiträge seit 2006
vor 5 Jahren

sieh unten

R
romu2000 Themenstarter:in
291 Beiträge seit 2006
vor 5 Jahren

Hallo,

erst einmal danke für die ganzen Antworten.
Die Daten stammen aus einer Webabfrage von einem Kunden. Die 10 Sekunden Abfragezeit war nur ein Beispiel. Es können auch alle 5 Minuten eine Abfrage gestartet werden.

die Daten alss ich mir über Json Post request liefern. Es sind ca. 100 Datensätze die einmal täglich über eine SQL Datenbank eingelesen bekomme. Diese lasse ich mir dann Realtime im Datagridview anzeigen. Wir ein Wert grün in der jeweiligen Spalte weiß ich das ich persönlich etwas unternehmen muss.

Das ganze funktioniert auch soweit, in dem ich einen Button in jeder Row des Datagrids anklicke und dadurch den Webrequest ausführe.

Genial wäre es natürlich das ganze jeweils automatisiert zu einen bestimmten Zeitpunkt mit einem Abstand von z.B. 5 Minuten Reihe für Reihe durch das Datagridview abzufragen.

Nur habe ich leider keinen Anhaltspunkt wie ich das machen kann.

Der e.rowIndex liefert mit ja nur die entsprechende Reihe bei einem Klick auf selbige.

Ich habe einen Button in den ich den Code gerne einfügen würde und dann wie oben beschrieben automatisiert laufen lassen würde.

  
  
public void button2_Click(object sender, EventArgs e)  
        {  
System.Threading.Thread.Sleep(20000);  
  
            for (int rowIndex = 0; rowIndex < dataGridView1.Rows.Count; rowIndex++)  
            {  
                  
                DataRow row = ((DataRowView)dataGridView1.Rows[e.RowIndex].DataBoundItem).Row;  
  
  
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://test.da?" + row[4].ToString());  
            httpWebRequest.ContentType = "application/json";  
            httpWebRequest.Method = "POST";  
  
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();  
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))  
  
  
            {  
                var result = streamReader.ReadToEnd();  
                textBox1.Text = result.ToString();  
            }  
  
  
                if (textBox1.Text.Contains("666666"))  
                {  
                    textBox3.Text = "Test";  
                    dataGridView1[6, rowIndex].Style.BackColor = Color.Green;  
                }  
                else  
                {  
                    textBox3.Text = "Nein";  
                    dataGridView1[6, rowIndex].Style.BackColor = Color.Red;  
                }  
                      
  
  
                }  
            }   
  
  

Mit diesem Ansatz komme ich leider nicht weiter.

R
romu2000 Themenstarter:in
291 Beiträge seit 2006
vor 5 Jahren

Hallo,

habe es mit foreach hinbekommen.

Danke für die Hilfe.

Jetzt ist es nur so dass ich mein Programm währen den Abfragen nicht mehr nutzen kann !?!?
Erst nachdem alle Abfragen ausgeführt worden sind kann ich wieder auf mein Programm zugreifen.

Liegt wahrscheinlich am Thread.Sleep().

J
251 Beiträge seit 2012
vor 5 Jahren

Th69 hat Dir darauf schon den Hinweis gegeben bzw. passenden FAQ

4.939 Beiträge seit 2008
vor 5 Jahren

Und für die regelmäßigen Abfragen nutze einen Timer, welcher am besten asynchron den Web-Request durchführt (um die GUI nicht zu blockieren, s. mein vorheriger Link!).