Hilfe beim DataGridView drucken



  • Hallo,
    ich möchte die daten aus meinem Datagridview (geht über mehrere Seiten) drucken.
    Ich habe schon vieles probiert nur leider wird immer nur eine leere seite gedruckt 😞 !
    ich habe mir schon einige bsp angesehen zB:
    http://social.msdn.microsoft.com/forums/de-DE/vcplusexpresseditionde/thread/5f991418-1dca-49c6-83d6-192beef9d359/

    nur leider bekomme ich es nicht hin!

    Vielleicht könnte mir jemand ein Codebeispiel schicken oder irgendwie anders weiterhelfen! Oder vl. könnte mir jemand eine funktionierende Verion vom oben stehenden link mit allen Variablendefinitionen senden 🙂 !!
    wäre echt super 😃 !

    mfg woiti



  • Mmmh. Du hast doch schon einen hilfreichen Link gepostet. Grundsätzlich kannst du imho das Grid nicht automatisch drucken, sondern musst ein Graphics Objekt, wie in deinem Bsp, mit z. B. drawString() füllen. Letztlich zeichnest du die Tabelle nach und kannst dann anschliessend das fertig gezeichnete Objekt ausdrucken. Wenn dein Blatt nur leer ist, wirst du wahrscheinlich ein falsches oder ein leeres Graphics Objekt übergeben. Kann ich aber nur vermuten, hast ja schliesslich keinerlei Code gepostet. Schau mal auf MSDN, da gabs seinerzeit ganz ordentliche Webcast zum Thema "Drucken mit .net 2.0"...



  • Das ist mein Code... auf MSDN hab ich nicht gefunden!

    [cli]
    private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		Int32 intSiteTop;
    		Int32 intAktuelleZeile;
    		Int32 intAnzahlZeilen;
    		String^ documentContents;
    		String^ stringToPrint;[/cli]
    
    [cli]private: System::Void printDocument1_PrintPage(System::Object^  sender, System::Drawing::Printing::PrintPageEventArgs^  e) 
    
    		 {
    
    SolidBrush^ drawBrush = gcnew SolidBrush(richTextBox1->ForeColor);
    
    		//Create point for upper-left corner of drawing.
    
    		PointF drawPoint = PointF(0.0,0.0);
    
    		try
    
    			{
    
    			float flZeilenProSeite = 0;
    
    			float flImTextZeieln = 0;
    
    			int flRandLinks = e->MarginBounds.Left -intSiteTop;
    
    			int flRandOben = e->MarginBounds.Top -intSiteTop;
    
    			//int flRandRechts = e->MarginBounds.Right;
    
    			int flDruckbreite = Convert::ToInt32(e->MarginBounds.Width);
    
    			int flVertikalPos = e->MarginBounds.Top -intSiteTop;
    
    			int intDruckzeile = 0;
    
    			String^ strZeile = nullptr;
    
    			//errechnen der Zeilenanzahl pro Seite
    
    			flZeilenProSeite = e->MarginBounds.Height / richTextBox1->Font->GetHeight(e->Graphics);
    
    			flZeilenProSeite += 10;
    
    			//Höhe einer Zeile
    
    			int flZeilenHoehe = Convert::ToInt32(richTextBox1->Font->GetHeight(e->Graphics));
    
    			while(intAktuelleZeile < intAnzahlZeilen)
    
    			{
    
    				//strZeile = strAusgabezeilen[intAktuelleZeile];
    
    			//Breite der ZEile berechnen
    
    			SizeF sizeZeilenbreite = e->Graphics->MeasureString(strZeile,richTextBox1->Font);
    
    			//Wenn eine Zeile breiter als der bedruckbare Bereich ist, dann wird hier die Höhe erweitert.
    
    			int flZeilenHoeheAktuell = 0;
    
    			if(sizeZeilenbreite.Width > flDruckbreite)
    
    			{
    
    			//Anzahl der Zeilen berechnen
    
    			int intZeilenAnzahl = Convert::ToInt32(sizeZeilenbreite.Width) / flDruckbreite;
    
    			//Rest berechnen; ist der Rest größer 0, wird eine Zeile "angehängt"
    
    			int intZeilenRest = safe_cast<int>(sizeZeilenbreite.Width) % safe_cast<int>(flDruckbreite);
    
    			if(intZeilenRest > 0) 
    
    			{
    
    			intZeilenAnzahl++;
    
    			}
    
    			flZeilenHoeheAktuell = Convert::ToInt32(flZeilenHoehe) ^intZeilenAnzahl;
    
    			intDruckzeile = intDruckzeile + intZeilenAnzahl;
    
    			}
    
    			else
    
    			{
    
    			flZeilenHoeheAktuell = flZeilenHoehe;
    
    			}
    
    			//Zeichenbereich
    
    			RectangleF^ rectBereich = gcnew RectangleF(Convert::ToSingle(flRandLinks), Convert::ToSingle(flVertikalPos), Convert::ToSingle(flDruckbreite), Convert::ToSingle(flZeilenHoeheAktuell));
    
    			//Vertikale Position neu berechnen
    
    			flVertikalPos = flVertikalPos + Convert::ToInt32(rectBereich->Height);
    
    			//Ausdruck der aktuellen Zeile
    
    			SolidBrush^ drawBrush = gcnew SolidBrush(richTextBox1->ForeColor);
    
    			e->Graphics->DrawString(strZeile, richTextBox1->Font, drawBrush, Convert::ToSingle(flRandLinks),Convert::ToSingle(flVertikalPos));
    
    			intAktuelleZeile++;
    
    			intDruckzeile++;
    
    			//Wenn noch Zeilen vorhanden sind, neue Seite erzeugen
    
    			if(intDruckzeile >= flZeilenProSeite) 
    
    			{
    
    			if(intAnzahlZeilen >= flZeilenProSeite) 
    
    			{
    
    			e->HasMorePages = true;
    
    			}
    
    			else
    
    			{
    
    			e->HasMorePages = false;
    
    			}
    
    			//Verlassen der Routine wenn das Seitenende erreicht ist
    
    			return; 
    
    			} 
    
    			}
    
    			}
    
    			catch(Exception^ e)
    
    			{ 
    
    			//MessageBox::Show(e->Message,MessageTitel + " Fehler in " + e->Source ,MessageBoxButtons::OK,MessageBoxIcon::Exclamation);
    
    			}[/cli]
    

    Über jede Hilfe würde ich mich freuen 🙂

    mfg woiti



  • Hallo

    Ich benutze die "ControlPrint.dll" ist zwar nicht das beste aber funktioniert

    Hier der Link
    http://www.codeproject.com/KB/printing/ControlPrint.aspx

    Gruß Willi


Anmelden zum Antworten