Autor Beitrag
flyhigh83
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Di 11.01.11 11:37 
Hallo,

ich hoffe ihr könnt mirelativ schnell auf die Sprünge helfen. Irgendwie habe ich hier einen großen Denkfehler gerade.
Ich habe ein Datagridview in welchem ich meine Tour sehe mit allen Zielen. Das Datagridview soll durchlaufen werden und mir dann alle GPS Koordinaten etc. ausgeben, welche in einer anderen Tabelle stehen. Ich wollte dies eigentlich mal über die Linq Abfrage versuchen, da ich so auch ziemlich simpel auf die einzelnen Elemente zugreifen kann, wie ich gesehen habe. Jetzt habe ich aber das Problem, das in der Zweiten Foreachschleife er ständig hängen bleibt. Also die erste wird nie vollständig durchgeführt. Ich erhalte hinterher eine Tabelle, welche nur das erste Element aus dem Datagridview enthält. Irgendwie habe ich glaube ich den Denkfehler bei meiner Linq, da diese ja selbst wie eine Foreach funktioniert, wie ich gelesen habe.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
List<TomTom> Routenzielelist = new List<TomTom>();
      foreach (DataGridViewRow row in DataGridView1.Rows)
      {
        TomTom Routenziel = new TomTom();

        var Tour =
          (from tourplan in dbDataSet.tourplan
           where tourplan.idTourplan == Convert.ToInt32(DataGridView1.CurrentRow.Cells[2].Value)
           select tourplan);

        foreach (var ZielTour in Tour)
        {
          Routenziel.GeoData1 = ZielTour.Gps1.ToString();
          Routenziel.GeoData2 = ZielTour.Gps2.ToString();
          Routenziel.Bezeichnung = ZielTour.Strasse.ToString() + " " + ZielTou.Ort.ToString();
        }

        Routenzielelist.Add(Routenziel);
      }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 11.01.11 11:45 
Wofür ist der äußere foreach? Du benutzt row nicht.
flyhigh83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Di 11.01.11 12:13 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wofür ist der äußere foreach? Du benutzt row nicht.


Die äußere ist für das DataGridview. Hatte mir gedacht das bringt zumindest minimale Performance da meine Tour also die Werte im Datagridview normal vieleicht zwischen 10 und 30 Ziele mal haben. Die Punkte aber welche in der großen Tabelle gespeichert sind, gegen die ich das Abfrage, hat aber mehrere Tausende.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 11.01.11 12:30 
Da du row nicht benutzt machst du dann immer noch 10-30 mal das gleiche. Wolltest du nicht eher in deinem Linq Ausdruck für Tour row benutzen anstatt DataGridView1.CurrentRow? Und als nächsten Schritt den foreach gleich weg lassen und dbDataSet.tourplan mit DataGridView1.Rows im Linq Ausdruck joinen?
flyhigh83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Di 11.01.11 12:40 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Da du row nicht benutzt machst du dann immer noch 10-30 mal das gleiche. Wolltest du nicht eher in deinem Linq Ausdruck für Tour row benutzen anstatt DataGridView1.CurrentRow? Und als nächsten Schritt den foreach gleich weg lassen und dbDataSet.tourplan mit DataGridView1.Rows im Linq Ausdruck joinen?


Ups, jetzt muss ich langsam machen. Ich verstehe gerade jetzt garnichts mehr.

ganz kurz zu meinem verständnis.

Die Schleife "foreach (var ZielTour in Tour)" habe ich nur gebaut, da durch die Abfrage welche dann in "Tour" steckt ein Datensatz mit mehreren Spalten steht, und ich mir einige Spalten abgreife.

Was ist nicht verstehe, ist was du oben sagst, das ich anstatt "Tour" zur verwenden eigentlich meine Schleife so ausehen sollte.

ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (var ZielTour in row)
{
...
}


Ich habe es gerade nicht getestet, aber sind die schleifen nicht so das man normal immer sagen muss ich habe ein Element oder Row, in meinem Fall ZielTour genanngt und ich will jedes Element aus der Tabelle oder was auch immer in meinem Fall "Tour" anfassen und dann etwas damit machen?

Sonst müsstest du mir irgend einen kleinen Ausschnitt als Code mal basteln das ich verstehe was du damit meinst, wie dein Konstrukt funktionieren soll. Ich versuche mich derzeit schonmal weiter.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 11.01.11 13:13 
Ich meinte diese Schleife (also die andere von den beiden ;) )

ausblenden C#-Quelltext
1:
foreach (DataGridViewRow row in DataGridView1.Rows)					


Du benutzt das row Objekt nicht sondern greifst stattdessen

ausblenden C#-Quelltext
1:
2:
3:
4:
var Tour =
          (from tourplan in dbDataSet.tourplan
           where tourplan.idTourplan == Convert.ToInt32(DataGridView1.CurrentRow.Cells[2].Value)
           select tourplan);


immer auf DataGridView1.CurrentRow zu. Machst also je Schleifendurchlauf immer das gleiche. Da sollte also entsprechend oft auch immer wieder das gleiche Ergebnis rausfallen.

Und als 2.ten Punkt du machst einfach eine 1 aus n Auswahl in deinem Linq Ausdruck (aka Gib mir für eine idTourplan die Daten). Datensätze finden kann eine Datatable allein mit den eingebauten mitteln. Da Linq zu benutzen macht die Sache nicht einfacher. Einfacher wird es (Geschmacksache) wenn du dbDataSet.tourplan mit DataGridView1.Rows joinst. Dann kann man gleich eine Liste von TomTom's aus dem Linq Statement rausfallen lassen und die foreach Schleifen komplett ersetzen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var Tour =
    from tourplan in dbDataSet.tourplan
    join row in DataGridView1.Rows on tourplan.idTourplan equals Convert.ToInt32(row.Cells[2].Value)
    select new TomTom
    {
        GeoData1 = tourplan.Gps1,
        GeoData2 = tourplan.Gps2,
        Bezeichnung = tourplan.Strasse.ToString() + " " + tourplan.Ort.ToString()
    };

Routenzielelist = Tour.ToList(); // falls du unbedingt eine List brauchst und IEnumerable<TomTom> nicht reicht

Für diesen Beitrag haben gedankt: flyhigh83
flyhigh83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Di 11.01.11 14:15 
Danke Ralf

das erste hatte ich auch gerade gesehen. Das zweite war mir so noch nicht bekannt, und funktioniert sehr gut. Danke.