Laden...

Forenbeiträge von serial Ingesamt 902 Beiträge

16.12.2011 - 15:15 Uhr

Hi FZelle

  1. Ich persönlich halte nichts von solchen geschachtelten Detailviews, denn so kommst du sehr schnell zu diesen unsäglichen Endlosformularen, die wenn sie per Controls erzeugt werden ruck zuck zu echten Problemen führen.
    Listen sollte man als Listen anzeigen und Details kann man dann ja einzeln anzeigen.

Das sehe ich genauso, allerdings sind die Anforderungen eben so, und da kann ich nichts dran machen 😦 Endlosformulare werden es nicht, da immer nur ein Ausschnitt angezeigt wird, mit Paging. Listenansicht geht nicht, da es eben eine mehrfache Hierarchy ist, und Master-Detail geht nicht, da es dann zu große Einschnitte in dem Workflow bei der Bedienung gibt.

Wenn PresA schon den Button "Erzeuge neu" hat, sollte dies als event ausgeführt, von Root aboniert und dann behandelt werden.
Man sollte niemals von "unten nach oben" in hierarchien zugreifen.

Ist es hier besser, dass der RootPresenter sich an ein Event des ChildPresenters hängt? Oder soll sich der RootPresenter an ein Event des ChildViews hängen? Oder doch einen Applicationcontroller dazwischen schalten?

mfg
Serial

16.12.2011 - 10:48 Uhr

Hallo Gemeinde,

mich würde mal interessieren, wie ihr folgenden Anwendungsfall lösen würdet, bzw welche Herangehensweise die richtige ist.

Ich habe ein Datenmodel mit 3 Ebenen:

Root
--ChildA (0...n) (komplexer eigener Typ)
---- ChildB(0...n) (komplexer eigener Typ)

Code:


public class Root
{
  public List<ChildA> Children
{get;set;}
}

public class ChildA
{
 public List<ChildB> ChildrenB
 {get;set;}
}

public class ChildA
{}

Diese Struktur möchte ich visualisieren, am besten mit MVP.
Ganz pragmatisch habe ich für jeden Typ eine entsprechende View gebastelt (normale Gridviews etc reichen nicht aus) und einen Presenter, ich habe also ein RootView und einen RootPresenter. EIn ChildAView und einen ChildAPresenter und ein ChildBView und einen ChildBPresenter.

Das Rootview soll nun eine Liste von ChildAViews haben, und jedes ChildAView eine Liste von ChildBViews. Bis dahin noch ohne Probleme, der RootPresenter holt das Rootobjekt, gibt es an das View und dieses erstellt für jedes ChildA-Element in Root ein ChildAView und fügt es einem Panel hinzu. Das selbe gilt für ChildAView und Liste von ChildBViews. Nun der Punkt an dem ich mir nicht ganz sicher bin.
--> Das Hinzufügen und Löschen von CHildelementen: auf Grund der Anforderungen ist es so, dass ich um zB ein neues ChildA-Objekt hinzuzufügen/zu löschen, ich einen Button in einem vorhandenen ChildAView klicke (Element davor/danach einfügen zB). Das heisst, das hinzufügen/löschen handelt hier nicht der RootPresenter (der ja nur die Auflistung der ChildAObjekte kennt), sondern der ChildAPresenter, der ja aber nur sein eigenes ChildAObjekt kennt. Sollte ich hier nun einen ApplicationController verwenden? Also das ChildAPresenter eine Methode AddNext/AddPrev anbietet, dieser dann ein Event feuert welches der Applicationcontroller behandelt, und dann auf dem RootPresenter eben eine entsprechende Add/Remove-Methode aufruft? Oder sollte der ChildAPresenter die komplette Liste von ChildAObjekten kennen, damit er selbst ein neues Element einfügen kann? Oder ein ganz anderen Ansatzpunkt?

Beispiel Presenter


public class RootPresenter
{
 Root _root;
 public RootPresenter(Root r)
 {
   _root = r;
 }
}

public class ChildAPresenter
{
 ChildA _child;
 public ChildAPresenter(ChildA child)
 {
  _child = child;
 }
}

//ChildBPresenter dann Analag

Ich hoffe das war nciht zu kompliziert beschrieben und freue mich über eure antworten. 😃

mfg
serial

30.11.2011 - 13:18 Uhr

Hallo,

danke erstmal für die antwort.
Aber kann das funktionieren? Denn in diesem Interface wären dann ja Typen, welche in der aus der Basis.xml generierten Datei erzeugt wurden.

In einer neu erzeugten Codedatei (aus der erweiterten XML) sind die gleichen Typen ja auch drin, und da mackert dann ja der Compiler, dass in der Schnittstelle ein anderer Typ ist, als in der implementierenden Klasse. Oder verstehe ich hier gerade etwas falsch?

Die Basisklasse wäre ja Root.

mfg
serial

30.11.2011 - 12:42 Uhr

Hallo Leute,

ich hoffe ich bin hier im richtigen Forum.
Ich habe folgendes Problem:

Ich erzeuge aus xsd-Schemas Code per xsd.exe.
Nun ist in jedem Schema ein bestimmter Teil immer gleich, und diesen Teil möchte ich beim Deserialisieren zentral auslesen. Nach dem deserialisieren baue ich mir ein Objektmodel auf und fülle dieses durch die Daten aus den generierten Klassenobjeten.
Problem ist, das xsd.exe natürlich für jedes Schema alle Klassen erstellt, und ich somit keine Interfaces oder Basisklasse verwenden kann, in der alle gemeinsamen Teile drin sind, und diese zentral auslesen kann.

Beispiel: (Codes sind beispielhaft)

schema1.xml(basis)

<root>
<element>
  <child/>
</element>
</root>

schema1.cs

public class Root
{
  public element Element
{get;set;}
}

public class element
{
 string child;
}

schema2.xml

<root>
<element>
  <child/>
</element>
<addElement>
  <addChild/>
</addElement>
</root>

schema2.cs

public class Root
{
  public element Element
{get;set;}

public addElement AddElement
{get;set;}
}

public class element
{
 string child;
}

public class addElement
{
 string addChild;
}

Und dann habe ich eben noch einen "Mapper", welcher das zentral behandeln sollte:

class Mapper
{
   public BaseObject GetBaseObject(object generatedClass)
  {
    //hier möchte ich typsicher auf die gleichen Bereiche zugreifen und
   //mein Objekt zusammenbauen
  }
}

Das folgende geht ja nicht, da es unterschiedliche Klassen sind:

class Mapper
{
   public BaseObject GetBaseObject(Root generatedClass)
  {
   string child = generatedClass.Element.child;
  }
}

Habe ich hier die möglichkeit, eine art vererbung oder interfaces einzusetzen?
Da er ja in jeder generierten Codedatei alle Klassen erstellt, kann ich keine Schnittstellensignatur erstellen.

Ich hoffe die Frage ist nicht zu umständlich gestellt und mir kann jemand helfen.

Danke schonmal
serial

08.11.2011 - 11:44 Uhr

Hallo,

ja leider mus ich herbivore recht geben. Die benutzer wollen (bzw dürfen nicht, da hier alles sehr just in time ist) nicht erst wieder umdenken. Sie haben ihre prozesse verinnerlicht, und das eben auch mit der benutzerführung von infopath.
Also Eine Liste wo Spalten wieder einzelne Listen enthalten können und diese alle Daten anzeigen.

So nun brauch ich eben eine Möglichkeit das darzustellen, performant...und vorallem muss in dieser Struktur auch bearbeitet werden können (also brauch ich controls zum edit).

Das Grid von dAn!3L sieht gut aus, kann man da, wie im datagridview, auch daten manipulieren?

mfg
serial

08.11.2011 - 09:46 Uhr

Hallo,

ich habe heute das Thema nochmal in einem Meeting. Mal sehen was da raus kommt.
Prinzipiell soll es erstmal ein Prototyp werden, d.h. möglichst wenig Aufwand.

Also mir persönlich gefällt für soetwas ein typisches Master/Detail-Control....aber auch ein komplett aufgeklapptes TreeView (wie herbivore sagte) wäre vielleicht eine Möglichkeit.

WPF kann ich mir gut vorstellen, nur hab ich damit noch nicht wirklich viel gemacht....und ich möchte nicht das erstmal das lernen der technologie viel zeit in anspruch nimmt.

mfg
serial

07.11.2011 - 18:13 Uhr

Hallo,

was dagegen spricht? Quasi nix.
Aber wie bilde ich in einer Liste meine verschachtelten Objekte ab, ohne Eigenschaften zusammenzulegen etc?

Ich habe es mit dem DataGridView versucht, aber ausser das ich verschachtelte Auflistungen als DropDown anzeigen kann, hab ich nix brauchbares gefunden.

Sorry zu dem wort, ich hab nun keinen klaren kopf mehr 😉

mfg
serial

07.11.2011 - 18:05 Uhr

Hallo,

sorry ich habe mich entwas unglücklich ausgedrückt.
Das Form wird in einer Chipfabrik eingesetzt, wo zB nur ein trackball zur bedienung vorhanden ist.
Bis jetzt war alles mit infopath abgebildet...das soll geändert werden, allerdings mit so wenig bedienimpact wie möglich. Und in den infopathformularen war eben alles in einer liste (auch nicht alles auf einmal sichtbar), aber die leute haben durch scrollen schnell ihre benötigte stelle gefunden. Dieses "verhalten" soll quasi beibehalten werden. Ich selbst würde natürlich auch ein treeview nehmen...aber ich bin nicht der alleinige entscheider 😦

Also zusammengefasst: sie müssen nicht alles sehen, aber sie wollen schnell dahinscrollen, ohne erst irgendetwas zu klicken oder zu öffnen.

mfg
serial

07.11.2011 - 16:45 Uhr

Hallo Leute,

ich stehe vor der Aufgabe, viele verschachtelte Daten anzuzuzeigen und zu bearbeiten.
Struktur ist ca so:

Rootobjekt
 -PropertyA
 -PropertyB
 -Liste von ChildObjektA

ChildObjektA
 -PropertyA
 -PropertyB
 -Liste von ChildobjektB

ChildObjektB
 -PropertyA
 -...

nun kann es sein, dass es ca 1000 Rootobjekte, mit jeweils bis zu 100 Childobjekten gibt (worst-case)

Wie kann ich das relativ performant und nutzerfreundlich anzeigen, sodass auch neue Einträge möglich sind, und alle Daten "auf einen Blick sichtbar sind" (also TreeView ist nicht möglich).
Ich habe an ein Control gedacht, welches in sich selbst geschachtelt ist (da die Properties immer gleich sind), und welches ich einfach der Form hinzufüge.

Habt ihr bessere Vorschläge?

mfg
serial

09.01.2011 - 13:41 Uhr

Hallo,

auch interessant zu wissen, wie dein service benutzt wird.
Als singleton oder nicht?

Wenn du singleton hast, könntest du deinem service eine logginginstanz über ein interface direkt dem konstruktor zu übergeben, und die erstellte servicceinstanz an den konstruktor der ServiceHost-Klasse zu übergeben.

Auch möglich wäre es hier, wenn der Service events anbieten würde.

mfg
serial

28.12.2010 - 21:18 Uhr

Hallo,

ich würde einen ReaderWriterLockSlim verwenden, da damit optimaler der lesezugriff geregelt wird.

mfg
serial

27.12.2010 - 20:35 Uhr

HAllo,

du solltest das etwas anders lösen:

Ich halte es für besser, wenn die eigentliche Aufgabe in einen seperaten Thread kommt, und NICHT das öffnen eines Dialoges.

Starte in Form1 deine Suche in einem eigenen Thread und öffne aus Form1 heraus danach den Dialog.
Wenn Abbrechen geklickt wurde, wurde dies per Event an Form1 mitgeteilt, welches eine Abbruchvariable auf true setzt.
Der Thread, welcher die Suche ausführt, sollte diese VAriable prüfen, und ggf abbrechen.

Noch besser wäre es wohl, einfach den BackgroundWorker zu verwenden.

Wenn du .net 4 verwendest, kannst du die Suche in einem Task starten lassen, und von Form1 aus eine CancellationToken setzen.

mfg
serial

22.12.2010 - 22:15 Uhr

Hallo,

c# ist aber keine vorraustzung, wie du geschrieben hast.

mfg
serial

22.12.2010 - 20:20 Uhr

Folgendes Buch kann ich dir empfehelen
>
. Voraussetzung sind die Grundlagen der Programmiersprache C# und OOP.

zero_x

da das buch in Java ist, ist c# nicht zwangsläufig eine vorraussetzung =)

mfg
serial

22.12.2010 - 17:51 Uhr

Hallo,

du solltest generische Colelctions verwenden, zum Beispiel List<T>.
Würde soetwas gehen List<List<deinTyp>>.

mfg
serial

22.12.2010 - 17:38 Uhr

HAllo,

wenn du zur Compiletime weisst, welche Klasse du verwendest, kannst du diese einfach durch eien Factory erzeugen lassen.
Wenn du es erst zur Laufzeit weisst, dann kannst du das mit einem IoC-Container machen, oder dir einen kleinen Minikernel per Reflection selbst schreiben.

Wichtig ist nur, dass du entweder mit Basisklassen (am besten abstract und nur wenn du verhalten in mehreren Unterklassen benötigst) oder Interfaces arbeitest.

Im .net4 hast du auch noch die möglichkeit dies mit dynamic zu machen, da benötigst du auch keine Basisklassen oder Interfaces (wobei das nicht unbedingt guter stil ist).

mfg
serial

22.12.2010 - 17:35 Uhr

Hallo,

von einem direkten Weiterwerfverbot habe ich so noch nix gehört.
Wichtig ist doch immer, wenn man kann, den Fehler zu behandeln und einen ordentlichen Status zu erreichen, wenn dies auf unterschiedlichen Ebenen passieren muss, dann werf ich den Fehler weiter.

Interessant finde ich eine herangehensweise, wo man vor seine Klasse/Komponente eine Art Sicherungsfasade schaltet, welche das Fehlerhandling übernimmt, und die eigentliche Komponente komplett frei von dieser bleibt.
Für Fehler, welche direkte Eingriffe benötigen kann man eine Art Diagnose und Repair-Schnittstellen anbieten,auf die die Fasade zugreifen kann, und das darunterliegende Model in einen ordentlichen Zustand versetzen kann.

Wenn du aber nur am Ort des Fehlers sinnvoll etwas machen kannst, dann wirst du da nicht drumrum kommen.

Alleridngs könnte man sicehrlich auch dein vorhaben in einer Transaktion abwickeln, die in der Domainlogik gestartet wird, und deine DB-Transaktionen beinhaltet (UnitOfWork und Repository), somit hast du in der Domain die möglichkeit bei einem Fehler deine Objekte in einen ordentlichen Zustand zu versetzen, und das Rollback ist automatisch schon durchgeführt.

mfg
serial

22.12.2010 - 12:30 Uhr

Trotzdem muss man hier noch sagen, dass die Seite dennoch neu lädt.

mfg
serial

22.12.2010 - 11:19 Uhr

HAllo,

welchen Timer benutzt du?
AJAX Timer?

Du musst dir im klaren sein, dass bei der sererseitigen verarbeitung alle events des lebenszyklus durchlaufen werden...das kannst du nicht verhindern..

[Edit] du kannst infos auch im Sessionstate speichern....aber beim tick um das "laden" der seite wirst du nicht umher kommen.

mfg
serial

22.12.2010 - 10:45 Uhr

HAllo,

was meinst du mit zeitintensiv?
Wenn eine Exception fliegt, ist es doch theoretisch egal, wie lang eine Behandlung dauert da:
1: die normale Arbeit so und so gerade nicht weitergeht
und
2: die Behandlung doch sicher aus gutem Grund so lange dauert?

Also ich finde es legitim den Fehler gewrapped weiterzuwerfen (auch wenn einige sagen, man sollte nur eigene Exceptions erstellen, wenn man diese speziell behandelt).
Du könntest noch darüber nachdenken, das scheitern als "normales" ergebnis anzusehen, und auf exceptions zu verzichten, und dies mit Rückgabewerten machen, aber dann gehst du von dem sinnvollen konstrukt der Exceptions weg, und wieder hin zu dem Returncode-"Schlamm".

Also meine Meinung: wrappe und wirf es.

mfg
serial

22.12.2010 - 09:41 Uhr

HAllo,

ich weiss nicht genau, ob ASEnumerable wirklich auf Linq to Objects "umschaltet", versuch doch mal ToList().

Fakt ist, dass Contains nicht in eine entsprechende Sql-Syntax umgewandelt werden kann.

mfg
serial

21.12.2010 - 21:27 Uhr

Hallo,

man müsste wohl etwas code sehen.
Ich gehe davon aus, das du ein feld deklariert hast, dieses womöglich aber nicht initialisierst.

mfg
serial

21.12.2010 - 10:24 Uhr

@herbivore:

ich hab mich vielleicht etwas unklug ausgedrückt, mir geht es nur um eine join-komponente. Da hab ich leider noch nix gefunden, und in der sampleanwendung war glauib ich auch keine drin?! Wenn doch, schau ich gleich nochmal.

trotzdem danke

mfg
serial

21.12.2010 - 09:43 Uhr

HAllo,

mich interessiert mal eure implementierung so einer komponente, also wenn ihr den code postet oder irgendwo hochladet, würd ich mich freuen.

mfg
serial

17.12.2010 - 23:11 Uhr

Hallo,

dann wird es wohl mit dem schemaübertrag auf das dataset und das füllen einer neuen row zu tun haben.

hm....ne genaue idee hab ich gerade nicht...

mfg
serial

17.12.2010 - 21:07 Uhr

hallo,

was genau kommt für eine meldung?
StackOverflow? DivisionNUll, ZU groß für Integer?

Laut stacktrace würde ich sagen es liegt an einem wert der in int gecastet werden soll!
Wie sehen die daten in der db aus? Welchen db-typ haben sie?
Gibt es noch mehr code herum der relevant sein könnte?

mfg
serial

17.12.2010 - 17:22 Uhr

Hallo,

du könntest noch eine komponente davorschalten, die dieses zusammenführen übernimmt, und über die platine konfiguriert wird und weiss, wieviele abhängige komponenten es gibt.

Geht etwas gegen das konzept, aber was anderes fällt mir auf anhieb nicht ein.

mfg
serial

17.12.2010 - 15:38 Uhr

Allerdings läuft das nicht so einfach, wie ich befürchtet hatte, weil Invoke bei Invoke die Argumente nicht passen.
Grüße...

dann gibt VS ja sicher auch einen Fehler, welcher Parameter wo nicht passt?

mfg
serial

17.12.2010 - 10:25 Uhr

Hallo,

was meinst du mit eingetragen?
Meinst du das registrieren des events in der designer-codedatei?
Der Eventhandler in der Codedatei der Form?

mfg
serial

17.12.2010 - 09:51 Uhr

Die Exception, kann man die noch etwas eingrenzen, durch eine inner-exception oder so?

Hat der server eine andere version der assembly, wo das modul drin sein müsste?

mfg
serial

17.12.2010 - 09:23 Uhr

Das Problem tritt das erste mal auf, wenn ich die oben genannte Methode aufrufe, und ein Modulobjekt zur Visualisierung hinzufügen möchte. - Solang die Gruppe nur Modulobjekte besitzt, zu der der Client auch das Modul besitzt ist alles in Ordnung. Erst wenn innerhalb der Gruppe noch ein weiterer Modultyp ist, kracht es in der Anwendung.

wahrscheinlich weil du dem rückgabewert infos hinzufügst, für module die der client nicht hat.

mfg
serial

16.12.2010 - 22:32 Uhr

Was ist denn group?
Wenn du nur mit strings arbeitest und keine types/instanzen erzeugst, dürfte der fehler nicht kommen.

mfg
serial

16.12.2010 - 20:39 Uhr

Hallo,

entweder wir reden aneinander vorbei, oder ich weiss auch nicht.
Es hilft dir, dass der server nur objekte schickt die er hat, und die der client hat, sodass auf server oder clientseite eben keine exception fliegen kann, weil nur objekte/typen geholt werden, die auf beiden seitenvorhanden sind.

mfg
serial

16.12.2010 - 17:21 Uhr

Du sollst auch garkeine Typen schicken, die der Client nicht hat.

Sondern so:

  1. Module registrieren sich am Client
  2. Client schickt alle vorhandenen Typen als Name an Server
  3. server schaut, welche er vom CLient übermittelten Typen hat (Schnittmenge)
  4. Schickt die Schnittmenge als Typen zurück zum Client.

mfg
serial

16.12.2010 - 16:58 Uhr

Nunja,

meine herangehensweise kannst du trotzdem verwenden, indem du den server alle registrierten module schickst (per assemblyqulifiedname o.ä), und dieser als antwort alle ihm verfügbaren liefert.

Auf serverseite brauchst du ja nur versuchen, den typ anhand des namens zu erstellen, und wenn es nicht klappt, hat der server dieses modul nicht.

mfg
serial

16.12.2010 - 16:28 Uhr

Hallo,

ach server muss nicht alles haben?Ging aus deinem Post nicht ganz hervor.
Da hast du recht, ich überleg weiter, muss nur erstmal schnell vom rechner weg...

mfg
serial

16.12.2010 - 16:02 Uhr

Hallo,

der Client ist aj der einzigste der weiss, was er hat.
Also würde ich in irgendeiner art die infos auch vom client liefern lassen.

zB könnten deine Module sich "installieren", dass dein Client intern alle Typen hält, die er hat, und diese an den Server mitgibt.

mfg
serial

15.12.2010 - 10:46 Uhr

Hallo,

wie gesagt, wenn du DataSet/DataTable benutzt kannst du relativ einfach direkt Änderungen in die DB scheriben. Dies empfehle ich allerdings wirklich nur wenn nciht mehr als CRUD-Aktionen auf den Daten ausgeführt werden.

mfg
serial

14.12.2010 - 20:57 Uhr

HAllo,

wenn du C# kannst sollte es ein leichtes sein den VB code zu "übersetzen".
Solltest du kein C# können, schau dir lieber erstmal die Grundlagen der Sprache an.

mfg
serial

14.12.2010 - 20:30 Uhr

Sind teilweise extrem lange CODE Zeilen. Gibt es da nichts einfaches?

Gruß an alle

die länge der codezeile sollte nicht immer der grund sein, diese lösung nicht zu nehmen.
Bei COM bis zu .net4 ist es oft der fall, das die Methoden ziemlich viele parameter erwarten, darum wird es so lang.

In .net4 wird dies mit dynamic einfacher.

mfg
serial

14.12.2010 - 20:28 Uhr

Hallo,

welchen integer hast du denn genommen?
signed oder unsigned?

mfg
serial

14.12.2010 - 15:03 Uhr

Hallo,

du kannst das Filtern über einenButton anstoßen, wo die Werte aus den DDLs ausgelesen werden, somit hast du nicht immer den selben code.

Du könntest auch ein ObjectDataSource verwenden, und die Selectparameter von Controls auslesen.

mfg
serial

14.12.2010 - 13:27 Uhr

OK,

das sehe ich allerdings problematisch, wenn du es wirklich so machst:

EVENTHANDLER

  • Neue Row erstellen
    - Eventhandler anmelden
  • Row der internen Liste hinzufügen
  • Row der Table hinzufügen

das solltest du NICHT im Eventhandler machen, dies kann auch zu nebeneffekten führen.

mfg
serial

14.12.2010 - 13:22 Uhr

Hallo,

ich würde immer nur so viele Objekte holen, wie tatsächlich benötigt werden.
Wie sieht denn eine übersichtsliste aus?
Müssen da immer alle vorhanden sein, vielleicht kann man diese mit einem standardfilter "vorfiltern".

Beim bearbeiten eines kunden benötigst du ja immer nur diesen.
Wenn du nur daten anzeigst, und es keine komplizierten regeln gibt, und das db-schema erlativ einfach ist, und es keine großen vererbungshierarchien gibt, kannst du ohne probleme deine entsprechenden daten in ein dataset laden, und dieses an deine forms binden. (TableDataGateway)

mfg
serial

14.12.2010 - 13:17 Uhr

Hallo,

also so wie ich das sehe, speicherst du die Rows immernoch in der Session, besser ist es diese jedesmal im Init neu zu erzeugen, wie MarsStein schon gesagt hat.

Ich würde dir dennoch empfehlen mit einem GridView zu arbeiten, und deine Aktionen mit Commands in diesem zu behandeln.

mfg
serial

14.12.2010 - 11:33 Uhr

Hallo,

wie sieht denn BindGrid aus?
Ich gehe davon aus, dass du in GridView1_PageIndexChanging() über BindGrid("","") die ungefilterte Liste als DataSource setzt.

mfg
serial

14.12.2010 - 11:15 Uhr

Hallo,

wie hast du das Filtern implementiert?
Wenn du im Gridview navigierst, wird ein Postback ausgeführt, möglicherweise werden da die filter zurückgesetzt.

mfg
serial

10.12.2010 - 12:44 Uhr

return springt zur Rücksprungaddresse, welche sich in besonderen fällen auch innerhalb der foreach befinden kann. Das Schleifenkonstrukt "foreach" hat also mit return nichts zu tun. Das einzige, was auf Schleifenkonstrukte Auswirkungen hat, sind break und continue.

oops sorry, ich war auch bei break, nicht bei return.
Du hast natürlich vollkommen recht.

10.12.2010 - 12:26 Uhr

Hallo,

return in einer normalen foreach verlässt die schleife komplett, wogegen continue nur den aktuellen durchlauf abbricht und beim nächsten weitermacht.

[Edit] siehe hinweis von jack30lena

mfg
serial