public static void drawFieldGrid(SheetField field,Sheet sheet,Graphics g,XGraphics gx,Statement stmt=null,MedLab medLab=null) { _printMargin.Top=40; if(sheet.SheetType==SheetTypeEnum.MedLabResults) { _printMargin.Top=120; } UI.ODGrid odGrid=new UI.ODGrid();//Only used for measurements, also contains printing/drawing logic. odGrid.FontForSheets=new Font(field.FontName,field.FontSize,field.FontIsBold?FontStyle.Bold:FontStyle.Regular); int _yAdjCurRow=0;//used to adjust for Titles, Headers, Rows, and footers (all considered part of the same row). odGrid.Width=0; List<DisplayField> Columns=SheetUtil.GetGridColumnsAvailable(field.FieldName); foreach(DisplayField Col in Columns) { odGrid.Width+=Col.ColumnWidth; } odGrid.Height=field.Height; odGrid.HideScrollBars=true; odGrid.YPosField=field.YPos; odGrid.Title=field.FieldName; if(stmt!=null) { odGrid.Title+=(stmt.Intermingled?".Intermingled":".NotIntermingled");//Important for calculating heights. } odGrid.TopMargin=_printMargin.Top; odGrid.BottomMargin=_printMargin.Bottom; odGrid.PageHeight=sheet.HeightPage; DataTable Table=SheetUtil.GetDataTableForGridType(field.FieldName,stmt,medLab); #region Fill Grid, Set Text Alignment odGrid.BeginUpdate(); odGrid.Columns.Clear(); ODGridColumn col; for(int i=0;i<Columns.Count;i++) { col=new ODGridColumn(Columns[i].Description,Columns[i].ColumnWidth); switch(field.FieldName+"."+Columns[i].InternalName) {//Unusual switch statement to differentiate similar column names in different grids. case "StatementMain.charges": case "StatementMain.credits": case "StatementMain.balance": case "StatementPayPlan.charges": case "StatementPayPlan.credits": case "StatementPayPlan.balance": col.TextAlign=HorizontalAlignment.Right; break; case "StatementAging.Age00to30": case "StatementAging.Age31to60": case "StatementAging.Age61to90": case "StatementAging.Age90plus": case "StatementEnclosed.AmountDue": case "StatementEnclosed.DateDue": col.TextAlign=HorizontalAlignment.Center; break; default: col.TextAlign=HorizontalAlignment.Left; break; } odGrid.Columns.Add(col); } ODGridRow row; for(int i=0;i<Table.Rows.Count;i++) { row=new ODGridRow(); for(int c=0;c<Columns.Count;c++) {//Selectively fill columns from the dataTable into the odGrid. row.Cells.Add(Table.Rows[i][Columns[c].InternalName].ToString()); } if(Table.Columns.Contains("PatNum")) {//Used for statments to determine account splitting. row.Tag=Table.Rows[i]["PatNum"].ToString(); } odGrid.Rows.Add(row); } odGrid.EndUpdate(true);//Calls ComputeRows and ComputeColumns, meaning the RowHeights int[] has been filled. #endregion for(int i=0;i<odGrid.RowHeights.Length;i++) { if(_isPrinting && (odGrid.PrintRows[i].YPos-_printMargin.Top<_yPosPrint //rows at the end of previous page || odGrid.PrintRows[i].YPos-sheet.HeightPage+_printMargin.Bottom>_yPosPrint)) { continue;//continue because we do not want to draw rows from other pages. } _yAdjCurRow=0; //if(odGrid.PrintRows[i].YPos<_yPosPrint // || odGrid.PrintRows[i].YPos-_yPosPrint>sheet.HeightPage) { // continue;//skip rows on previous page and rows on next page. //} #region Draw Title if(odGrid.PrintRows[i].IsTitleRow) { switch(field.FieldName) {//Draw titles differently for different grids. case "StatementMain": Patient pat=Patients.GetPat(PIn.Long(Table.Rows[i]["PatNum"].ToString())); string patName=""; if(pat!=null) {//should always be true patName=pat.GetNameFLnoPref(); } if(gx==null) { g.FillRectangle(Brushes.White,field.XPos-10,odGrid.PrintRows[i].YPos-_yPosPrint,odGrid.Width,odGrid.TitleHeight); g.DrawString(patName,new Font("Arial",10,FontStyle.Bold),new SolidBrush(Color.Black),field.XPos-10,odGrid.PrintRows[i].YPos-_yPosPrint); } else { gx.DrawRectangle(Brushes.White,p(field.XPos-10),p(odGrid.PrintRows[i].YPos-_yPosPrint-1),p(odGrid.Width),p(odGrid.TitleHeight)); using(Font _font=new Font("Arial",10,FontStyle.Bold)) { GraphicsHelper.DrawStringX(gx,Graphics.FromImage(new Bitmap(100,100)),(double)((1d)/p(1)),patName,new XFont(_font.FontFamily.ToString(),_font.Size,XFontStyle.Bold),XBrushes.Black,new XRect(p(field.XPos-10),p(odGrid.PrintRows[i].YPos-_yPosPrint-1),p(300),p(100)),XStringAlignment.Near); //gx.DrawString(patName,new XFont(_font.FontFamily.ToString(),_font.Size,XFontStyle.Bold),new SolidBrush(Color.Black),field.XPos-10,yPosGrid); } } break; case "StatementPayPlan": SizeF sSize=new SizeF(); using(Graphics f= Graphics.FromImage(new Bitmap(100,100))) {//using graphics f because g is null when gx is not. sSize=f.MeasureString("Payment Plans",new Font("Arial",10,FontStyle.Bold)); } if(gx==null) { g.FillRectangle(Brushes.White,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint,odGrid.Width,odGrid.TitleHeight); g.DrawString("Payment Plans",new Font("Arial",10,FontStyle.Bold),new SolidBrush(Color.Black),field.XPos+(field.Width-sSize.Width)/2,odGrid.PrintRows[i].YPos-_yPosPrint); } else { gx.DrawRectangle(Brushes.White,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint-1,odGrid.Width,odGrid.TitleHeight); using(Font _font=new Font("Arial",10,FontStyle.Bold)) { GraphicsHelper.DrawStringX(gx,Graphics.FromImage(new Bitmap(100,100)),(double)((1d)/p(1)),"Payment Plans",new XFont(_font.FontFamily.ToString(),_font.Size,XFontStyle.Bold),XBrushes.Black,new XRect(p(field.XPos+field.Width/2),p(odGrid.PrintRows[i].YPos-_yPosPrint-1),p(300),p(100)),XStringAlignment.Center); //gx.DrawString("Payment Plans",new XFont(_font.FontFamily.ToString(),_font.Size,XFontStyle.Bold),new SolidBrush(Color.Black),field.XPos+(field.Width-sSize.Width)/2,yPosGrid); } } break; default: if(gx==null) { odGrid.PrintTitle(g,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint); } else { odGrid.PrintTitleX(gx,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint); } break; } _yAdjCurRow+=odGrid.TitleHeight; } #endregion #region Draw Header if(odGrid.PrintRows[i].IsHeaderRow) { if(gx==null) { odGrid.PrintHeader(g,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow); } else { odGrid.PrintHeaderX(gx,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow); } _yAdjCurRow+=odGrid.HeaderHeight; } #endregion #region Draw Row if(gx==null) { odGrid.PrintRow(i,g,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow,odGrid.PrintRows[i].IsBottomRow,true); } else { odGrid.PrintRowX(i,gx,field.XPos,odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow,odGrid.PrintRows[i].IsBottomRow,true); } _yAdjCurRow+=odGrid.RowHeights[i]; #endregion #region Draw Footer (rare) if(odGrid.PrintRows[i].IsFooterRow) { _yAdjCurRow+=2; switch(field.FieldName) { case "StatementPayPlan": DataTable tableMisc=AccountModules.GetStatementDataSet(stmt).Tables["misc"]; if(tableMisc==null) { tableMisc=new DataTable(); } Double payPlanDue=0; for(int m=0;m<tableMisc.Rows.Count;m++) { if(tableMisc.Rows[m]["descript"].ToString()=="payPlanDue") { payPlanDue=PIn.Double(tableMisc.Rows[m]["value"].ToString()); } } if(gx==null) { RectangleF rf=new RectangleF(sheet.Width-60-field.Width,odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow,field.Width,odGrid.TitleHeight); g.FillRectangle(Brushes.White,rf); StringFormat sf=new StringFormat(); sf.Alignment=StringAlignment.Far; g.DrawString("Payment Plan Amount Due: "+payPlanDue.ToString("c"),new Font("Arial",9,FontStyle.Bold),new SolidBrush(Color.Black),rf,sf); } else { gx.DrawRectangle(Brushes.White,p(sheet.Width-field.Width-60),p(odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow),p(field.Width),p(odGrid.TitleHeight)); using(Font _font=new Font("Arial",9,FontStyle.Bold)) { GraphicsHelper.DrawStringX(gx,Graphics.FromImage(new Bitmap(100,100)),(double)((1d)/p(1)),"Payment Plan Amount Due: "+payPlanDue.ToString("c"),new XFont(_font.FontFamily.ToString(),_font.Size,XFontStyle.Bold),XBrushes.Black,new XRect(p(sheet.Width-60),p(odGrid.PrintRows[i].YPos-_yPosPrint+_yAdjCurRow),p(field.Width),p(odGrid.TitleHeight)),XStringAlignment.Far); } } break; } } #endregion } }