Druck über mehrere Seiten.....Nur die erste wird gedruckt

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Druck über mehrere Seiten.....Nur die erste wird gedruckt

    Hallo zusammen, bin neu hier im Forum und hoffe ihr könnt mir ein bischen helfen.
    Als erstes hoffe ich das ich hier im richtigen Teil des Forums poste.....
    Wenn nicht , nicht gleich schimpfen :)

    So und nun zu meinem Problem, ich lese mit einer Schleife meine Datenbank aus per SQL, und drucke diese Datensätze aus. Das funktioniert auch supi bei wenigen Sätzen (die auf eine Seite passen :) )
    Aber er gibt mir einfach keine weitere Seite aus, sondern überschreibt die ersten wieder auf der ersten Seite.
    Gedruckt wird im Querformat ( Landscape=True )
    x_achse ist die Position von oberen Rand, und wird bei jedem Durchgang dementsprechen hoch gesetzt.

    Und mit der Abfrage versuche ich ihm zu sagen das die Seite voll ist und er die nächste benutzen soll, er geht auch in die Abfrage rein aber erzeugt leider keine neue Seite.

    Ich hoffe ich konnte mich einigermaßen klar ausdrücken.
    Ich hoffe ihr könnt mir auf die Sprünge helfen....habe schon so einiges ausprobiert und mir erlesen aber irgendwie fehlt mir der zündende Funke :)


    VB.NET-Quellcode

    1. While reader.Read
    2. e.Graphics.DrawString(reader("vorname"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse, x_achse, text_links)
    3. e.Graphics.DrawString(reader("nachname"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 100, x_achse, text_links)
    4. e.Graphics.DrawString(reader("strasse"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 230, x_achse, text_links)
    5. e.Graphics.DrawString(reader("plz"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 410, x_achse, text_links)
    6. e.Graphics.DrawString(reader("wohnort"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 500, x_achse, text_links)
    7. e.Graphics.DrawString(reader("telefon"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 650, x_achse, text_links)
    8. e.Graphics.DrawString(reader("mobil"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 750, x_achse, text_links)
    9. e.Graphics.DrawString(reader("email"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 850, x_achse, text_links)
    10. e.Graphics.DrawString(reader("geburtstag"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 1000, x_achse, text_links)
    11. x_achse = x_achse + 30
    12. If x_achse >= 680 Then
    13. e.HasMorePages = True
    14. x_achse = 200
    15. End If
    16. End While
    17. e.Graphics.DrawString("Ausdruck vom :" & " " & aktuellesDatum, New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, 60, 750, text_links)
    18. e.HasMorePages = False
    19. reader.Close()
    20. con.Close()
    Willkommen im Forum.

    Guckst Du: Drucken mehrseitiger Dokumente
    Letztenendes geht es darum, dass Du selber mit der Seitensteuerung arbeiten musst. Du musst die Seitenindizes hochzählen und seitenindexabhängig dem Compiler mitteilen, was er auf welche Seite drucken soll.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo und Danke schön,

    Danke für die schnelle Antwort, das projekt das du gepostet hast , habe ich auch schon durch.....aber ich finde nicht den weg es bei mir umzusetzen

    ich weiss im Vorfeld wieviel Seiten es werden, ich weiss wieviele Zeilen auf eine Seite passen und ich weiss die anzahl der datensätze (sprich wieviele zeilen gedruckt werden müssen). Ich dachte das das reicht um zu drucken....aber Pusteblume....e.HasMorePages verweigert sich mir :)

    GesamtZeilen= "Anzahl der Datensätze"
    AnzahlSeiten= " Berechnung aus Anzahl der Datensätze /10"
    ZeilenProSeite= " Fester Wert (16 ), mehr passen nicht nicht drauf ohne das es nicht schön aussieht"
    AktuelleZeile = "Zähler der mitläuft"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mctotti“ ()

    Mctotti schrieb:

    e.HasMorePages verweigert sich mir
    wenn ich den Code oben angucke, denke ich, dein Denkfehler ist, dass du die Reader-Schleife weiterlaufen lässt, nachdem e.HasmorePages erreicht ist.
    So ist das nicht gedacht.
    Sondern, wenn die Seite voll ist, muss die _PrintPage() - Methode natürlich verlassen werden - die Seite ist ja voll!
    Und mit e.HasMorePages teilst du dem Ducker-Controller mit, dasses noch mehr Seiten gibt, und dann ruft er die _PrintPage()-Methode erneut auf.

    Dassis code-architektonisch eine ziemliche Herausforderung, weil der Reader darf nicht geclosed werden, sondern muss seine Arbeit beim nächsten Aufruf von _PrintPage() wieder aufnehmen.
    Hallo
    wenn ich den Code oben angucke, denke ich, dein Denkfehler ist, dass du die Reader-Schleife weiterlaufen lässt, nachdem e.HasmorePages erreicht ist.​


    Ganz genau so ist es.
    Ich hatte auch schon probiert die schleife zu verlassen wenn die Seite voll ist. Das hat auch funktioniert. Nur hat er keine weitere Seite gedruckt. Er hat zwar e.HasMorePages auf True gesetzt aber keine weitere Seite angelegt.

    Das normal drucken über mehrere Seiten ist ansich nicht das problem, aber mit der schleife drin und dem reader denn schon. Wie oben schon beschrieben, die erste seite druckt er perfekt, aber sobald er eigentlich eine weitere drucken soll haut er alles auf die erste Seite drauf .
    Ich habe 21 Datensätze in der DB, 16 passen auf eine Seite, das macht er auch wunderbar, aber dann......haut er mir die nächsten 5 Sätze auf die ersten 5 der ersten Seite.
    Wenn er mir jetzt die zweite seite bringen würde dann würde es ja klappen......
    Aber er macht es einfach nicht.....
    Habe auch schon mit Haltestops die einzelnen Schritte verfolgt, er macht wie ich es gern hätte, nur eben bringt er mir nicht die zweite Seite obwohl e.HasMorePages auf True geht.
    Wahrscheinlich hast du sogar recht und ich habe da irgendwo einen Denkfehler, aber ich komm nicht drauf :)

    Mctotti schrieb:

    aber ich finde nicht den weg es bei mir umzusetzen
    Arbeite den Code aus dem Tut vollständig durch:
    Drucken mehrseitiger Dokumente
    Da ist eine PrintPage-Routine, versuche die zu verstehen. Insbesondere HasMorePages wird da klar und verständlich gesetzt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Meines Erachtens geht das Unterfangen so nicht. Du müsstest erstmal die Daten alle mithilfe des Readers lesen, diese zwischenspeichern (List(Of String)? StringBuilder?) und dann erst drucken. Sobald Du eine Seite voll hast, aber mit den Daten noch nicht durch bist, musst Du HasMorePages auf True stellen und Dir merken, bis zu welchem Datensatz Du schon gedruckt hast. Danach wird der PrintPage-EventHandler eben wieder automatisch aufgerufen und dann musst Du festlegen, wo es mit welchem Datensatz weitergeht.

    ##########

    Ggf. eine Hilfe, wenn Du weißt, was auf welche Seite gehört:
    Ich hab mir ne kleine Hilfsklasse gebaut. Dafür allerdings einen eigenen Thread aufzumachen oder gar das Tutorial von RodFromGermany zu verschmutzen, lohnt sich in der Phase meines Erachtens aber nicht:
    PrintDocumentWithPageCounter

    VB.NET-Quellcode

    1. Imports System.Drawing.Printing
    2. Public Class PrintDocumentWithPageCounter : Inherits PrintDocument
    3. Public Event PrintPageWithIndex As EventHandler(Of PrintPageExEventArgs)
    4. Private _PageCount As Integer = 1
    5. Public Property PageCount As Integer
    6. Get
    7. Return _PageCount
    8. End Get
    9. Set
    10. _PageCount = Math.Max(0, Value)
    11. End Set
    12. End Property
    13. Private CurrentPageIndex As Integer = 0
    14. Private ContinuePrinting As Boolean = True
    15. Private Sub PrintDocumentWithPageCounter_BeginPrint(sender As Object, e As PrintEventArgs) Handles Me.BeginPrint
    16. CurrentPageIndex = 0
    17. ContinuePrinting = True
    18. End Sub
    19. Private Sub PrintDocumentWithPageCounter_PrintPage(sender As Object, e As PrintPageEventArgs) Handles Me.PrintPage
    20. PrintPageWithID(CurrentPageIndex, e)
    21. IncrementPageIndex()
    22. SetContinuePrintingFlag(e)
    23. End Sub
    24. Private Sub PrintPageWithID(PageIndex As Integer, e As PrintPageEventArgs)
    25. Dim CurrentPrintPageExEventArgs = New PrintPageExEventArgs With {.PrintPageEventArgs = e, .PageIndex = PageIndex}
    26. RaiseEvent PrintPageWithIndex(Me, CurrentPrintPageExEventArgs)
    27. ContinuePrinting = CurrentPrintPageExEventArgs.ContinuePrinting
    28. End Sub
    29. Private Sub IncrementPageIndex()
    30. CurrentPageIndex += 1
    31. End Sub
    32. Private Sub SetContinuePrintingFlag(e As PrintPageEventArgs)
    33. If Not ContinuePrinting Then e.HasMorePages = False : Return
    34. If PageCount > 0 Then e.HasMorePages = CurrentPageIndex < PageCount : Return
    35. e.HasMorePages = True
    36. End Sub
    37. End Class
    38. Public Class PrintPageExEventArgs
    39. Property PrintPageEventArgs As System.Drawing.Printing.PrintPageEventArgs
    40. Property PageIndex As Integer
    41. Property ContinuePrinting As Boolean = True
    42. End Class


    Damit kann man, wenn man weiß, was auf welche Seite gehört, etwas einfacher arbeiten, z.B.:

    VB.NET-Quellcode

    1. Private Sub PrintDocumentWithPageCounter1_PrintPageWithIndex(sender As Object, e As PrintPageExEventArgs) Handles PrintDocumentWithPageCounter1.PrintPageWithIndex
    2. Select Case e.PageIndex
    3. Case 0 : PrintPage1(e)
    4. Case 1 : PrintPage2(e)
    5. Case 2 : PrintPage3(e)
    6. End Select
    7. End Sub
    8. Private Sub PrintPage1(e As PrintPageExEventArgs)
    9. Using Font As New Font("Calibri", 12)
    10. e.PrintPageEventArgs.Graphics.DrawString("Foo", Font, Brushes.Black, 100, 100)
    11. End Using
    12. End Sub
    13. Private Sub PrintPage2(e As PrintPageExEventArgs)
    14. Using Font As New Font("Calibri", 24)
    15. e.PrintPageEventArgs.Graphics.DrawString("Bar", Font, Brushes.Black, 100, 100)
    16. End Using
    17. End Sub
    18. Private Sub PrintPage3(e As PrintPageExEventArgs)
    19. Using Font As New Font("Calibri", 144)
    20. e.PrintPageEventArgs.Graphics.DrawString("Baz", Font, Brushes.Black, 100, 100)
    21. End Using
    22. e.ContinuePrinting = False
    23. End Sub


    Stellt man PageCount auf > 0, werden entsprechend viele Seiten gedruckt, es sei denn man setzt irgendwann e.ContinuePrinting auf False. Werden die Seiten durch den PrintDocumentWithPageCounter_PrintPageWithIndex-EventHandler nicht abgearbeitet, bleiben sie eben leer.
    Stellt man PageCount auf 0, werden hingegen soviele Seiten generiert, bis man im PrintDocumentWithPageCounter_PrintPageWithIndex-EventHandler e.ContinuePrinting auf False setzt.
    Stellt man PageCount auf 0 und vergisst dann e.ContinuePrinting auf False zu setzen … naja, die Unendlichkeit ist nahe.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo,

    ich hab da mal ne zwischenfrage, als ich angefangen haben mit dem Drucken, habe ich die Daten mit einer For Each Schleife aus der DB geholt, Das Ergebnis war das gleiche.
    Aber dann wurde ich darauf hingewiesen das es mit einer For Each Schleife nicht geht. Eigentlich ist die Schleife mit der ich die Daten aus der DB hole doch egal oder?
    Zum Drucken mein ich jetzt. Das das verschiedene Schleifen sind ist mir schon bewusst :)

    VB.NET-Quellcode

    1. For Each row As DataRow In dt.Rows
    2. bla bla
    3. next
    Richtig, das ist so ziemlich egal. Du kannst nicht mit einer For-Each-Loop arbeiten. Sondern mit einer For i = StartIndex To EndIndex. Oder gar mit einer Do-Loop, welche ebenfalls mit StartIndex arbeitet. StartIndex ist zu Beginn 0. Dazu kommt noch ein Zähler Index. Jeder Datensatz, der vollständig gedruckt wurde, erhöht den Index um 1. Sobald kein Eintrag mehr auf die Seite passt, verfrachtest Du den Wert von Index in StartIndex, setzt HasMorePages auf True, verlässt die PrintPage-Prozedur. Nun wird automatisch PrintPage nochmal aufgerufen und Du fängst eben nicht bei 0 an, sondern soweit, wie Du auf der ersten Seite gekommen bist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ich bring hier mal den PseudoCode für mein Ansatz mittm Reader. Wesentlich sind die EventHandler-Methoden PrintDocument.BeginPrint, PrintDocument.PrintPage und PrintDocument.EndPrint.
    .BeginPrint ist dazu gedacht, den Druck zu initialisieren. .PrintPage dient zum Seiten-Drucken, .EndPrint - wenn fertig - wird dort aufgeräumt.

    VB.NET-Quellcode

    1. Public Class NameDerKlassewoderPrintStattfindenSoll
    2. Public PrintCommand As DBCommand ' irgendwie musste es hinbekommen, vor dem Druck hier das SqlDBCommand zuzuweisen
    3. Private _Reader As DBDataReader
    4. Private Sub PrintDocument_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument.BeginPrint
    5. _Reader = PrintCommand .ExecuteReader ' mehr Initialisierung brauhen wir nicht
    6. End Sub
    7. Private Sub PrintDocument_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument.PrintPage
    8. dim x_achse = 200
    9. While reader.Read
    10. e.Graphics.DrawString('... Dein Druck-Kram
    11. x_achse = x_achse + 30
    12. If x_achse >= 680 Then
    13. e.HasMorePages = True ' weiteres PrintPage-Event anfordern
    14. Return
    15. End If
    16. End While
    17. e.HasMorePages = False ' Reader ausgelesen - kein weiteres PrintPage-Event anfordern
    18. End Sub
    19. '(Edit: Aufräumen verlagert (s. post#12))
    20. Private Sub PrintDocument_EndPrint(sender As Object, e As Print?EventArgs) Handles PrintDocument.EndPrint
    21. PrintCommand.Dispose
    22. _Reader.Dispose
    23. End Sub
    24. End Class

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Wobei man wohl das Aufräumen (Zeile#20-#22) auch in den EndPrint-EventHandler verlagern kann.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,
    ich habe es geschafft :)
    Hier poste ich mal das Ergebnis damit ihr es auch sehen könnt :)
    Ich danke euch vielmals für eure tolle Unterstützung, Tips und Anregungen

    @ErfinderDesRades, ich werde deinen post mal ausprobieren, bin ja experimentierfreudig.
    Nochmals vielen Dank für eure tolle Unterstützung. :)

    firstRow habe ich als Integer deklariert
    Die Zahl 16 ist die Zeilenanzahl die aufs Papier passt ( Querformat )


    VB.NET-Quellcode

    1. For i As Integer = firstRow To dt.Rows.Count - 1
    2. If i - firstRow < 16 Then
    3. e.Graphics.DrawString(dt.Rows(i)("vorname"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse, x_achse, text_links)
    4. e.Graphics.DrawString(dt.Rows(i)("nachname"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 100, x_achse, text_links)
    5. e.Graphics.DrawString(dt.Rows(i)("strasse"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 230, x_achse, text_links)
    6. e.Graphics.DrawString(dt.Rows(i)("plz"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 410, x_achse, text_links)
    7. e.Graphics.DrawString(dt.Rows(i)("wohnort"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 500, x_achse, text_links)
    8. e.Graphics.DrawString(dt.Rows(i)("telefon"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 650, x_achse, text_links)
    9. e.Graphics.DrawString(dt.Rows(i)("mobil"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 750, x_achse, text_links)
    10. e.Graphics.DrawString(dt.Rows(i)("email"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 850, x_achse, text_links)
    11. e.Graphics.DrawString(dt.Rows(i)("geburtstag"), New Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, y_achse + 1000, x_achse, text_links)
    12. x_achse = x_achse + 30 'abstand von der vorherigen zeile
    13. Else
    14. firstRow = i
    15. e.HasMorePages = True
    16. cn.Close()
    17. Exit Sub
    18. End If
    19. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mctotti“ ()

    Das ist nicht das Ergebnis.
    Bitte poste immer ganze Methoden.
    Wesentlich ist ja das Zusammenspiel von .BeginPrint, .PrintPage, .EndPrint.

    Davon sieht man in deine verlorene Zeilen überhaupt nix, sondern man sieht nur, dass irgendein cn-Dingens gecloset wird, wann immer eine neue Seite zu drucken angefordert wird.
    (was ist mit dem SqlCommand und dem DataReader - gibts die noch, und wenn ja, werden sie auch aufgeräumt?)



    Weiters ist noch sehr zu empfehlen, nicht für jeden gezeichneten String ein neues Font-Objekt zu erstellen.
    Erstell das einmal, und benutze es, sooft es gebraucht wird. Das spart resourcen und macht Code leserlich

    VB.NET-Quellcode

    1. Using ft = New Font("Times New Roman", 10, FontStyle.Regular)
    2. e.Graphics.DrawString(dt.Rows(i)("vorname"), ft, Brushes.Black, y_achse, x_achse, text_links)
    3. e.Graphics.DrawString(dt.Rows(i)("nachname"), ft, Brushes.Black, y_achse + 100, x_achse, text_links)
    4. e.Graphics.DrawString(dt.Rows(i)("strasse"), ft, Brushes.Black, y_achse + 230, x_achse, text_links)
    5. e.Graphics.DrawString(dt.Rows(i)("plz"), ft, Brushes.Black, y_achse + 410, x_achse, text_links)
    6. e.Graphics.DrawString(dt.Rows(i)("wohnort"), ft, Brushes.Black, y_achse + 500, x_achse, text_links)
    7. e.Graphics.DrawString(dt.Rows(i)("telefon"), ft, Brushes.Black, y_achse + 650, x_achse, text_links)
    8. e.Graphics.DrawString(dt.Rows(i)("mobil"), ft, Brushes.Black, y_achse + 750, x_achse, text_links)
    9. e.Graphics.DrawString(dt.Rows(i)("email"), ft, Brushes.Black, y_achse + 850, x_achse, text_links)
    10. e.Graphics.DrawString(dt.Rows(i)("geburtstag"), ft, Brushes.Black, y_achse + 1000, x_achse, text_links)
    11. End Using

    Hallo, da hast du vollkommen recht, wollte jetzt nicht das ganze Posten sondern nur da wo es hakte. Aber ich komme gern deinem Wunsch nach und poste in den nächsten Tagen die ganze Druck-Prozedur.
    Aber erst wenn ich sie so fertig habe wie ich möchte :-), Ich arbeite Hauptberuflich sehr viel und Progge in meiner Freizeit. Von daher bitte ich euch um ein bischen Geduld.
    Ausserdem denke und Progge ich anders wie die anderen, ich versuche immer zuerst die Aufgaben zu lösen. Um die Kosmetik und Korrektheit kümmere ich mich meistens immer danach.
    Ich weiss das du das anders siehst, das ist ja auch gut so. :)

    Mctotti schrieb:

    ich versuche immer zuerst die Aufgaben zu lösen. Um die […] Korrektheit kümmere ich mich meistens immer danach.
    :huh: Wie geht das denn zusammen? Aufgabe lösen, ohne sie korrekt zu lösen, ist doch gar nicht möglich. Sonst würde das ja heißen: Egal, welcher Mumpitz (bei der Berechnung/beim Drucken) rauskommt, Hauptsache, irgendwas kommt raus.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Mctotti Und? Ist Dein Druckproblem nun gelöst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Mctotti Lässt Du uns an Deiner Lösung Teil haben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!