C# 报表和打印等

    说到报表打印、那就不得不说须要查数据库了,而后填写报表信息。设计报表用的 grid++。sql

   查数据库时候,我也是醉了,直接一个表自身与自身级联了4次。。。一共取了7个表的信息数据。数据库

关于级联--(表字段相同。可是  表1的父id能够做为表2的子id继续查询,循环递归。。。)服务器

用了左级联解决了,你能够看作是一张DNA的表吧,子--父(母)--(外)祖父、(外)祖母--。。。。spa

 //级联查询
 
     select t1.BoarID,t1.R_Herd,t1.Sex,t1.BirthField,t1.BirthDate,t1.EarNo,t1.BirthFetus,t1.NippleOfLeft,t1.NippleOfRight,t1.R_LSize,t1.R_Coeff,t1.FatherID,t1.MotherID,
     t2.FatherID as fFatherID,t2.MotherID as fMotherID,
     t3.FatherID as ffFatherID,t3.MotherID as fmMotherID,
     t4.FatherID as fffFatherID,t4.MotherID as fmmMotherID
     m2.FatherID as MFatherID,m2.MotherID as MMotherID,     
     m3.FatherID as MfFatherID,m3.MotherID as MmMotherID,
     m4.FatherID as MffFatherID,m4.MotherID as MmmMotherID
     from  [Breed].[dbo].[MY_Y_BoarBaseInfo] t1 
     left join [Breed].[dbo].[MY_Y_BoarBaseInfo] t2 on t1.FatherID = t2.BoarID 
     left join [Breed].[dbo].[MY_Y_BoarBaseInfo] t3 on t2.FatherID = t3.BoarID 
     left join [Breed].[dbo].[MY_Y_BoarBaseInfo] t4 on t2.MotherID = t4.BoarID 
     left join [Breed].[dbo].[MY_Y_BoarBaseInfo] m2 on t1.MotherID = m2.BoarID
     left join [Breed].[dbo].[MY_Y_BoarBaseInfo] m3 on m2.FatherID = m3.BoarID
     left join [Breed].[dbo].[MY_Y_BoarBaseInfo] m4 on m2.MotherID = m4.BoarID
     where t1.BoarID = '111';

你在查询数据的时候,首先要在数据库写一个存储过程,查询时候,直接调存储过程便可,调用方法设计

        public DataTable selectDetailData(string str)
        {
            DataTable dt = new DataTable();
            SqlParameter[] para = {
                                      new SqlParameter("@BoarID",str)
                                  };
            string boarid = str;

            //string sqlStr = string.Format(("select FatherID,MotherID,R_Herd,EarNo,BirthDate,BirthField,NippleOfLeft,NippleOfRight,Sex,R_Count from [Breed].[dbo].[MY_Y_BoarBaseInfo] where BoarID = '{0}') and select FatherID as grandfatherID FROM [Breed].[dbo].[MY_Y_BoarBaseInfo] where BoarID = ( SELECT FatherID from [Breed].[dbo].[MY_Y_BoarBaseInfo] where BoarID = '{1}',"boarid,boarid);

            dt = DataBaseModule.ExecuteReturnDataTable(DataBaseModule.ConnectionString,
                    CommandType.StoredProcedure, "存储过程名字", para);

            return dt;
        }

或者调用sql语句也可。。可是这就太。。。(注意根据使用方法选取类型)code

(关于在vs上面配置信息,就本身配吧,config里面改下,链接数据库就好了)orm

    <add key="connection" value="server=服务器;database=数据库;user=用户名;password=密码;" />

一个 SQLHelper类帮助 链接数据库,一句话server

 public static string ConnectionString88 = MySecurity.SDecryptString(ConfigurationManager.AppSettings.Get("connection88"));

报表设计时候、记得须要打印信息的字段填写。。。这个要本身摸索了,上下代码。blog

首先,报表打印的一个类。。我还没到这一步,直接拿的别人的。。不须要的删了递归

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using grdesLib;
using grproLib;

namespace GReport
{
    public class GridReport
    {

        private List<string> _list;

        public List<string> list
        {
            set { _list = value; } 
        }
        /// <summary>
        /// 报表
        /// </summary>
        GridppReport Report = new GridppReport();

        /// <summary>
        /// 须要导出的datagridview
        /// </summary>
        public DataGridView dgv;

        public DataTable db;
        public DataRow[] dr;
        /// <summary>
        /// 报表列
        /// </summary>
        public string[] ReportColumn;
        /// <summary>
        /// 报表参数
        /// </summary>
        public string[] ReportParameter;
        /// <summary>
        /// 设计程序参数
        /// </summary>
         public string[] ReportPParameter;
        /// <summary>
        /// 报表模版路径
        /// </summary>
        public string TemplatePath;
        public object tempReport;

        /// <summary>
        /// 关联参数
        /// </summary>
        public void Reportparameter()
        {
            if (ReportParameter.Length == ReportPParameter.Length)
            {
                for (int j = 0; j < ReportParameter.Length; j++)
                {

                    string str1 = ReportParameter[j];
                    string str2 = ReportPParameter[j];
                    Report.ParameterByName(ReportParameter[j]).AsString = ReportPParameter[j];
                }
            }
        }

        /// <summary>
        /// 填充列
        /// </summary>
        private void ReportFetchRecord()
        {
            if (dgv != null)
            {
                for (int row = 0; row < dgv.RowCount; row++)
                {
                    Report.DetailGrid.Recordset.Append();
                    for (int i = 0; i < ReportColumn.Length; i++)
                    {
                        if (dgv.Rows[row].Cells[i].Value != null)
                        {
                            Report.FieldByName(ReportColumn[i]).AsString = dgv.Rows[row].Cells[i].Value.ToString();
                            //Report.FieldByName(ReportColumn[i]).AsString = dgv.Rows[row].Cells[ReportColumn[i]].Value.ToString();
                        }
                    }
                    Report.DetailGrid.Recordset.Post();
                }
            }
            if (db != null)
            {
                for (int row = 0; row < db.Rows.Count; row++)
                {
                    Report.DetailGrid.Recordset.Append();
                    for (int i = 0; i < ReportColumn.Length; i++)
                    {
                        if (db.Rows[row][i] != null)
                        {
                            Report.FieldByName(ReportColumn[i]).AsString = db.Rows[row][i].ToString();
                            string str = db.Rows[row][i].ToString();
                        }
                    }
                    Report.DetailGrid.Recordset.Post();
                }
            }
            if (dr != null && dr.Length > 0)
            {
                for (int row = 0; row < dr.Length; row++)
                {
                    Report.DetailGrid.Recordset.Append();
                    for (int i = 0; i < ReportColumn.Length; i++)
                    {
                        if (dr[row][i] != null)
                        {
                            Report.FieldByName(ReportColumn[i]).AsString = dr[row][i].ToString();
                            string str = dr[row][i].ToString();
                        }
                    }
                    Report.DetailGrid.Recordset.Post();
                }
            }

        }
    

        private void ReportFetchRecordDB()
        {
            for (int row = 0; row < dgv.RowCount; row++)
            {
                Report.DetailGrid.Recordset.Append();
                for (int i = 0; i < ReportColumn.Length; i++)
                {
                    if (dgv.Rows[row].Cells[i].Value != null)
                    {
                        Report.FieldByName(ReportColumn[i]).AsString = db.Rows[row][i].ToString();
                    }
                }
                Report.DetailGrid.Recordset.Post();
            }
        }

        /// <summary>
        /// 去除按钮
        /// </summary>
        public void  RemoveToolBar(GRPrintViewer pPrintViewer)
        {
            //GRPrintViewer pPrintViewer = new GRPrintViewer();
           pPrintViewer.RemoveToolbarControl(GRToolControlType.grtctExport);
           pPrintViewer.RemoveToolbarControl(GRToolControlType.grtctMail);
           pPrintViewer.RemoveToolbarControl(GRToolControlType.grtctSaveDocument);
           pPrintViewer.RemoveToolbarControl(GRToolControlType.grtctExportPDFBtn);
           pPrintViewer.RemoveToolbarControl(GRToolControlType.grtctExportXLSBtn);       
        }


        /// <summary>
        /// 打印预览
        /// </summary>
        public void printpreview()
        {
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
            Report.LoadFromFile(Application.StartupPath + "" + TemplatePath + "");
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(Reportparameter);
            Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
            Report.ShowPreviewWnd += new _IGridppReportEvents_ShowPreviewWndEventHandler(RemoveToolBar);                                
            
            Report.PrintPreview(true);
        }

        // GridReport .Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
                   
        /// <summary>
        /// 打印预览
        /// </summary>
        public void printpreviews()
        {
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
            Report.LoadFromVariant(tempReport);
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(Reportparameter);
            Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
            Report.PrintPreview(true);
        }

        /// <summary>
        /// 打印预览
        /// </summary>
        public void printpreviews(bool flag)
        {
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
            Report.LoadFromVariant(tempReport);
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(Reportparameter);
            Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);

            PrintDialog _Dialog = new PrintDialog();
            Report.Printer.PrinterName = _Dialog.PrinterSettings.PrinterName;
            Report.Print(false);
            //Report.PrintPreview(true);
        }

        /// <summary>
        /// 设置列不可见
        /// </summary>
        /// <param name="list"></param>
        private void ReportInitialize()
        {
            if (_list != null && _list.Count > 0)
            {
                foreach (string ColName in _list)
                {
                    //IGRColumn iColName = Report.ColumnByName(ColName);
                    //if (iColName != null)
                    //    iColName.Visible = false;
                    Report.ColumnByName(ColName).Visible = false;
                }
            }
        }


        /// <summary>
        /// 打印
        /// </summary>
        public void print()
        {
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
            Report.LoadFromFile(Application.StartupPath + "" + TemplatePath + "");
            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(Reportparameter);
            Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
            Report.Print(true);
        }
    }
}

最后就是打印信息了,这几步,本身根据需求放在合适位置,该封装方法封装

//下面为打印信息

            GridReport gr = new GridReport();
           
            string[] ReportParameter = new string[] {你的字段信息(对应顺序)};
                gr.ReportParameter = ReportParameter;
            string[] ReportPParameter = new string[25];
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ReportPParameter[i] = string.Format("{0}", dt.Rows[0][i]);
            }
                
                gr.ReportPParameter = ReportPParameter;
                gr.TemplatePath = "/名称.grf";
            try
                {
                    gr.printpreview();
                }
                catch
                {
                    MessageBox.Show("打印出错了!");
                    return;
                }
            }

基本就完成了。。。可是差很少都是别人的代码,本身也就写了存储过程,修修补补。。。

 
 

ALTER PROCEDURE [dbo].[MY_BoarBaseInfoStoreProc] @XXX varchar(100) //定义字段 as beginsql语句 end