Gå til innhold

C#: [Løst]Printe en dynamisk tabell over flere sider


Anbefalte innlegg

Hei

 

Jeg har nå lett og prøvd å finne en løsning på hvordan en skal printe en dynamisk tabell over flere sider hvis det overstiger en fast definert størrelse.

 

Jeg har 2 datasett som jeg henter inn informasjon til som ligger lagret i xml filer som jeg viser i 2 stk datagridview på formen hvor nr 2 er avhengig av hva som er merket i grid 1.

De 2 gridene har forskjellig antall kolonner og så langt fungerer det utmerket.

Problet kommer når jeg skal skrive ut disse 2 gridene når det overskrider 1 side.

 

Jeg vet det eksisterer noe slikt som "e.HasMorePages = true" som generere flere sider

og det skjer forsåvidt som det skal også men med den svakheten at hele print dokumentet kjøres i en loop og jeg får alt på nytt på de andre sidene også. (Hvor ble det av printer.newpage og så var det akkurat det du fikk :roll: Tilbakeskritt??)

 

For å gruppere utskriften så det blir seende slik ut

 

 

 

bruker jeg en List funksjon som dette for å holde på header informasjon

public class ListPrintH
   {

     public string ID;
     public string Varenr;
     public string Vare;
     public string Behov1;
     public string Behov2;
     public string Levert1;
     public string Levert2;
     public string Avvik;
     public string Min;
     public string Max;
     public string AntKnyt;

     public ListPrintH(string _ID, string _Varenr, string _Vare, string _Behov1, string _Behov2, string _Levert1, string _Levert2, string _Avvik, string _Min, string _Max, string _AntKnyt)
      {
          this.ID = _ID;
          this.Varenr = _Varenr;
          this.Vare = _Vare;
          this.Behov1 = _Behov1;
          this.Behov2 = _Behov2;
          this.Levert1 = _Levert1;
          this.Levert2 = _Levert2;
          this.Avvik = _Avvik;
          this.Min = _Min;
          this.Max = _Max;
          this.AntKnyt = _AntKnyt;

      }
}

 

og denne List funksjonen for å holde på detaljer

   public class ListPrintD
   {

      public string ID;
      public string For;
      public string Pr;
      public string VareNr;
      public string Vare;
      public string Fakt;
      public string Total;
      public string TotSvinn;
      public string Ta1, Ta2, Ta3, Ta4, Ta5;
      public string Ta6, Ta7, Ta8, Ta9, Ta10;
      public string Ta11, Ta12, Ta13, Ta14, Ta15;


      public ListPrintD(string _ID, string _For, string _Pr, string _VareNr, string _Vare, string _Fakt, string _Total, string _TotalSvinn,
          string _Ta1, string _Ta2, string _Ta3, string _Ta4, string _Ta5,
          string _Ta6, string _Ta7, string _Ta8, string _Ta9, string _Ta10,
          string _Ta11, string _Ta12, string _Ta13, string _Ta14, string _Ta15 )
      {
          this.ID = _ID;
          this.For = _For;
          this.Pr = _Pr;
          this.VareNr = _VareNr;
          this.Vare = _Vare;
          this.Fakt = _Fakt;
          this.Total = _Total;
          this.TotSvinn = _TotalSvinn;
          this.Ta1 = _Ta1;
          this.Ta2 = _Ta2;
          this.Ta3 = _Ta3;
          this.Ta4 = _Ta4;
          this.Ta5 = _Ta5;
          this.Ta6 = _Ta6;
          this.Ta7 = _Ta7;
          this.Ta8 = _Ta8;
          this.Ta9 = _Ta9;
          this.Ta10 = _Ta10;
          this.Ta11 = _Ta11;
          this.Ta12 = _Ta12;
          this.Ta13 = _Ta13;
          this.Ta14 = _Ta14;
          this.Ta15 = _Ta15;


      }

   }

 

 

alt dette blir hentet ut igjen i printdokumentet dynamisk med dette

private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
       {
           if (grForedlet.RowCount > 0)
           {
               int Top = 40;

               List<ListPrintH> PHead = new List<ListPrintH>();
               List<ListPrintD> PDet = new List<ListPrintD>();
               string levDato = null;

               foreach (DataTable item in dsForedlet.Tables)
               {
                   foreach (DataRow row in item.Rows)
                   {
                       PHead.Add(new ListPrintH(row[0].ToString(), row[1].ToString(), row[2].ToString(), row[3].ToString(), row[4].ToString(), row[5].ToString(), row[6].ToString(), row[7].ToString(), row[9].ToString(), row[10].ToString(), row[11].ToString()));
                       levDato = row[8].ToString();

                   }
               }
               PHead.Sort(delegate(ListPrintH p1, ListPrintH p2)
               { return p1.Varenr.CompareTo(p2.Varenr); });


               foreach (DataTable item2 in dsRavare.Tables)
               {
                   foreach (DataRow row1 in item2.Rows)
                   {
                       PDet.Add(new ListPrintD(row1[0].ToString(), row1[1].ToString(), row1[2].ToString(), row1[3].ToString(), row1[4].ToString(), row1[5].ToString(), row1[6].ToString(), row1[7].ToString(), row1[8].ToString(), row1[9].ToString(),
                           row1[10].ToString(), row1[11].ToString(), row1[12].ToString(), row1[13].ToString(), row1[14].ToString(), row1[15].ToString(), row1[16].ToString(), row1[17].ToString(), row1[18].ToString(), row1[19].ToString(), row1[20].ToString(),
                           row1[21].ToString(), row1[22].ToString()));

                   }
               }



               Pen blackPen = new Pen(Color.Black, 0);
               Rectangle recHeading = new Rectangle(10, 10, 790, 30);
               StringFormat h = new StringFormat();
               Font myfont = new Font("Times New Roman", 14);

               h.Alignment = StringAlignment.Center;
               h.LineAlignment = StringAlignment.Center;
               e.Graphics.DrawString("Header tekst " + levDato, myfont, Brushes.Black, recHeading, h);



               PHead.ForEach(delegate(ListPrintH p)
               {

                   int Knyt = Convert.ToInt32(p.AntKnyt) * 13;

                   if ((Top + Knyt) > 1070)
                   {
                       Top = 40;

                   }
                   Createheading(e.Graphics, Top, p.Varenr, p.Vare, p.Behov2, p.Levert1, p.Levert2, p.Avvik, p.Min, p.Max);

                   List<ListPrintD> PDet2 = PDet.FindAll(delegate(ListPrintD p2) { return p2.For == p.ID; });
                   PDet2.Sort(delegate(ListPrintD p1, ListPrintD p2)
                   { return p1.Pr.CompareTo(p2.Pr); });

                   Top += 13;
                   PDet2.ForEach(delegate(ListPrintD p3)
                   {
                       CreateKnytning(e.Graphics, Top, p3.Pr, p3.VareNr, p3.Vare, p3.Fakt, p3.Total, p3.TotSvinn, p3.Ta1, p3.Ta2, p3.Ta3,
                           p3.Ta4, p3.Ta5, p3.Ta6, p3.Ta7, p3.Ta8, p3.Ta9, p3.Ta10, p3.Ta11, p3.Ta12, p3.Ta13, p3.Ta14, p3.Ta15);
                       Top += 13;
                   });
                   Top += 10;

               });








           }


           ++nPage;
           if (nPage < Pages) e.HasMorePages = true;
           else e.HasMorePages = false;

           }

 

Header griden blir tegnet slik fra printdocumentet

        private void Createheading(Graphics g, int top, string Varenr, string Vare, string Behov,string Levert1, string Levert2, string Avvik, string Min, string Max)
       {

           // Create pen.
           Pen blackPen = new Pen(Color.Black, 1);
           SolidBrush Brush = new SolidBrush(Color.LightGray);
           Rectangle recHeading1 = new Rectangle(10, top, 40, 13);
           Rectangle recHeading2 = new Rectangle(50, top, 201, 13);
           Rectangle recHeading3 = new Rectangle(251, top, 80, 13);
           Rectangle recHeading4 = new Rectangle(331, top, 50, 13);
           Rectangle recHeading5 = new Rectangle(381, top, 50, 13);
           Rectangle recHeading6 = new Rectangle(431, top, 70, 13);
           Rectangle recHeading7 = new Rectangle(501, top, 50, 13);
           Rectangle recHeading8 = new Rectangle(551, top, 70, 13);
           Rectangle recHeading9 = new Rectangle(621, top, 50, 13);
           Rectangle recHeading10 = new Rectangle(671, top, 70, 13);
           Rectangle recHeading11 = new Rectangle(741, top, 50, 13);


           g.FillRectangle(Brush, recHeading1);
           g.FillRectangle(Brush, recHeading2);
           g.FillRectangle(Brush, recHeading3);
           g.FillRectangle(Brush, recHeading4);
           g.FillRectangle(Brush, recHeading5);
           g.FillRectangle(Brush, recHeading6);
           g.FillRectangle(Brush, recHeading7);
           g.FillRectangle(Brush, recHeading8);
           g.FillRectangle(Brush, recHeading9);
           g.FillRectangle(Brush, recHeading10);
           g.FillRectangle(Brush, recHeading11);




           g.DrawRectangle(blackPen, recHeading1);
           g.DrawRectangle(blackPen, recHeading2);
           g.DrawRectangle(blackPen, recHeading3);
           g.DrawRectangle(blackPen, recHeading4);
           g.DrawRectangle(blackPen, recHeading5);
           g.DrawRectangle(blackPen, recHeading6);
           g.DrawRectangle(blackPen, recHeading7);
           g.DrawRectangle(blackPen, recHeading8);
           g.DrawRectangle(blackPen, recHeading9);
           g.DrawRectangle(blackPen, recHeading10);
           g.DrawRectangle(blackPen, recHeading11);

           Font myfont = new Font("Times New Roman", 7);
           StringFormat n = new StringFormat();
           StringFormat f = new StringFormat();
           StringFormat c = new StringFormat();

           f.Alignment = StringAlignment.Far;
           f.LineAlignment = StringAlignment.Center;

           c.Alignment = StringAlignment.Center;
           c.LineAlignment = StringAlignment.Center;

           n.Alignment = StringAlignment.Near;
           n.LineAlignment = StringAlignment.Center;


           g.DrawString(Varenr, myfont, Brushes.Black, recHeading1, n);
           g.DrawString(Vare, myfont, Brushes.Black, recHeading2, n);
           g.DrawString(Min + " < > " + Max, myfont, Brushes.Black, recHeading3, c);
           g.DrawString("Behov:->", myfont, Brushes.Green, recHeading4, f);
           g.DrawString(Behov, myfont, Brushes.Green, recHeading5, f);
           g.DrawString("Levert (+S):->", myfont, Brushes.Blue, recHeading6, f);
           g.DrawString(Levert1, myfont, Brushes.Blue, recHeading7, f);
           g.DrawString("Levert (-S):->", myfont, Brushes.Blue, recHeading8, f);
           g.DrawString(Levert2, myfont, Brushes.Blue, recHeading9, f);
           g.DrawString("Avvik (-S):->", myfont, Brushes.Red, recHeading10, f);
           g.DrawString(Avvik, myfont, Brushes.Red, recHeading11, f);
       }

 

Og detaljene blir tegnet med dette

        private void CreateKnytning(Graphics g, int Top, string Pri, string Varenr, string Vare,string Fak, string Levert, string Levert2,
           string T1, string T2, string T3, string T4, string T5, string T6, string T7, string T8, string T9,
           string T10, string T11, string T12, string T13, string T14, string T15)
       {
           // Create pen.
           Pen blackPen = new Pen(Color.Black, 1);
           Rectangle recHeading1 = new Rectangle(10, Top, 15, 13);
           Rectangle recHeading2 = new Rectangle(25, Top, 40, 13);
           Rectangle recHeading3 = new Rectangle(65, Top, 156, 13);
           Rectangle recHeading4 = new Rectangle(221, Top, 38, 13);
           Rectangle recHeading5 = new Rectangle(259, Top, 38, 13);
           Rectangle recHeading6 = new Rectangle(297, Top, 38, 13);
           Rectangle recHeading7 = new Rectangle(335, Top, 38, 13);
           Rectangle recHeading8 = new Rectangle(373, Top, 38, 13);
           Rectangle recHeading9 = new Rectangle(411, Top, 38, 13);
           Rectangle recHeading10 = new Rectangle(449, Top, 38, 13);
           Rectangle recHeading11 = new Rectangle(487, Top, 38, 13);
           Rectangle recHeading12 = new Rectangle(525, Top, 38, 13);
           Rectangle recHeading13 = new Rectangle(563, Top, 38, 13);
           Rectangle recHeading14 = new Rectangle(601, Top, 38, 13);
           Rectangle recHeading15 = new Rectangle(639, Top, 38, 13);
           Rectangle recHeading16 = new Rectangle(677, Top, 38, 13);
           Rectangle recHeading17 = new Rectangle(715, Top, 38, 13);
           Rectangle recHeading18 = new Rectangle(753, Top, 38, 13);



           g.DrawRectangle(blackPen, recHeading1);
           g.DrawRectangle(blackPen, recHeading2);
           g.DrawRectangle(blackPen, recHeading3);
           g.DrawRectangle(blackPen, recHeading4);
           g.DrawRectangle(blackPen, recHeading5);
           g.DrawRectangle(blackPen, recHeading6);
           g.DrawRectangle(blackPen, recHeading7);
           g.DrawRectangle(blackPen, recHeading8);
           g.DrawRectangle(blackPen, recHeading9);
           g.DrawRectangle(blackPen, recHeading10);
           g.DrawRectangle(blackPen, recHeading11);
           g.DrawRectangle(blackPen, recHeading12);
           g.DrawRectangle(blackPen, recHeading13);
           g.DrawRectangle(blackPen, recHeading14);
           g.DrawRectangle(blackPen, recHeading15);
           g.DrawRectangle(blackPen, recHeading16);
           g.DrawRectangle(blackPen, recHeading17);
           g.DrawRectangle(blackPen, recHeading18);


           Font myfont = new Font("Arial", 7);
           StringFormat n = new StringFormat();
           StringFormat f = new StringFormat();
           StringFormat c = new StringFormat();

           c.Alignment = StringAlignment.Center;
           c.LineAlignment = StringAlignment.Center;

           f.Alignment = StringAlignment.Far;
           f.LineAlignment = StringAlignment.Center;

           n.Alignment = StringAlignment.Near;
           n.LineAlignment = StringAlignment.Center;

           g.DrawString(Pri, myfont, Brushes.Black, recHeading1, c);
           g.DrawString(Varenr, myfont, Brushes.Black, recHeading2, c);
           g.DrawString(Vare, myfont, Brushes.Black, recHeading3, n);
           g.DrawString(T1, myfont, Brushes.Black, recHeading4, f);
           g.DrawString(T2, myfont, Brushes.Black, recHeading5, f);
           g.DrawString(T3, myfont, Brushes.Black, recHeading6, f);
           g.DrawString(T4, myfont, Brushes.Black, recHeading7, f);
           g.DrawString(T5, myfont, Brushes.Black, recHeading8, f);
           g.DrawString(T6, myfont, Brushes.Black, recHeading9, f);
           g.DrawString(T7, myfont, Brushes.Black, recHeading10, f);
           g.DrawString(T8, myfont, Brushes.Black, recHeading11, f);
           g.DrawString(T9, myfont, Brushes.Black, recHeading12, f);
           g.DrawString(T10, myfont, Brushes.Black, recHeading13, f);
           g.DrawString(T11, myfont, Brushes.Black, recHeading14, f);
           g.DrawString(T12, myfont, Brushes.Black, recHeading15, f);
           g.DrawString(T13, myfont, Brushes.Black, recHeading16, f);
           g.DrawString(T14, myfont, Brushes.Black, recHeading17, f);
           g.DrawString(T15, myfont, Brushes.Black, recHeading18, f);

       }

 

 

Har kjørt meg helt fast på dette nå og finner ingen løsning, er det noen som kan hinte meg på rett spor?

Dette er selvsagt C# men det har derer vel alt merket

 

PS! Dette blir vel sikkert beregnet som dårlig koding men bær over med meg med det :p er ingen dreven mann i faget

post-112143-1264947452_thumb.jpg

Endret av Icaro2
Lenke til kommentar
Videoannonse
Annonse

Å skrive ut en slik tabell er egentlig temmelig grei skuring. Som oftest lager du en funksjon som tar inn et Graphics objekt (fordi denne kan brukes til å tegne til bitmap, metafile eller printer)

 

Denne funksjonen kaller du deretter i PrintPage på et PrintDocument komponent (hvis du vil tegne til en skriver)

 

edit: e.HasMorePages er ikke så dumt som det kan virke til, dette fører til at du kan bruke samme funksjonen igjen for å skrive påfølgende sider. e variablen inneholder all informasjon du trenger for å vite hva du skal skrive ut.

Endret av GeirGrusom
Lenke til kommentar

Hei takk for svar så langt.

 

Jeg vet at det sannsynligvis ikke er dette du vil høre. Men hvorfor ikke skrive til en HTML-fil og printe den?

Evt bruke et rapporteringsverkøty?

 

-C-

Dette kunne selvsagt hvert en løsning men er redd jeg mister en del formatering som jeg vil ha på utskriften men celler etc.

Kan jeg printe ut grid via et rapport verktøy? og kan den hente fra 2 dataset og vise det slik som jeg har i bildet eller noe i nærheten kanskje :roll:

 

 

Å skrive ut en slik tabell er egentlig temmelig grei skuring. Som oftest lager du en funksjon som tar inn et Graphics objekt (fordi denne kan brukes til å tegne til bitmap, metafile eller printer)

 

Denne funksjonen kaller du deretter i PrintPage på et PrintDocument komponent (hvis du vil tegne til en skriver)

 

edit: e.HasMorePages er ikke så dumt som det kan virke til, dette fører til at du kan bruke samme funksjonen igjen for å skrive påfølgende sider. e variablen inneholder all informasjon du trenger for å vite hva du skal skrive ut.

 

Hvis dere ser på bildet som jeg la ved så er det dette jeg har fått til så langt på utskrift

men cluet her er at hver blokk har en header som har grå bakgrunn og hver av disse kan ha fra 1 til mange forskjellige under linjer avhengig av hva som er knyttet til headeren.

Hvis det er så at heder + underlinjene ikke vil passe på side 1 så er det slik at jeg ikke vil dele på det men printe hele den blokken på side 2 osv. (1 header vil ikke ta 1 side alene)

 

Har en følelse på at jeg skal sløyfe List funksjonen for jeg tror det kanskje er den som stopper meg litt.

 

Er det mulig å skrive ut et grapics objekt i printpage uten å bruke DrawRectangle, Drawline etc men tegne inn i objektet og presentere det på utskrift i etterkant?

Lenke til kommentar
miXer Lagt til I dag, 07:41

Har ikke et ark et visst antall linjer du kan skrive på? Kunne du ikke tellt hvor mange du har skrevet, sjekket om header+kolonnene er mindre enn antall linjer igjen og fortsette eller hoppe til neste side.

 

Hei

Det har jeg også gjort. Antall linjer har jeg med på sjekken (List<ListPrintH>)

i header på tabellen så den er forsåvidt grei. jeg klarer å sjekke ut om tabellen overstiger antall definerte linjer men problemet er når jeg går inn for å skrive ut på side 2 så inneholder ikke List funksjonen noen mulighet for å steppe inn i et gitt punkt igjen

(Har ikkke funnet ut om det er en slik mulighet og er ikke sikker på hva jeg skal lete etter) men ramser alt fra begynnelsen igjen. Skulle vært noe ala muligheten med array[0] for å steppe inn på et gitt punkt.

 

PHead.ForEach(delegate(ListPrintH p)
{

int Knyt = Convert.ToInt32(p.AntKnyt) * 13;

if ((Top + Knyt) > 1070)
{
Top = 40;

}

Her skulle det kanskje ikke brukt foreach men er det mulig å skrive ut 1 og 1 med List?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...