开源:MIS金质打印通原理及实现 Step by step 1


前面我们说了打印页面设置、打印机设置、打印预览对话框的实现,这个通用的类大家可以自己修改一下用于自己的项目中。这个类也将用于我们即将讲解并已实现的MIS金质打印通中,让我们一起动手来实现自己的MIS打印程序吧!

从现在开始,我们来一步一步的实现怎样打印管理信息系统(MIS)的报表、单据(如采购订单、订货单等)、合同(如工矿企业合同,格式非常复杂的合并网格,文本等)等等。

很多打印程序,都是针对特定的网格控件如DataGrid打印,但是,为了通用,我们想想怎么办呢?

实现的它们的核心,也就是实现二维数据的打印,加上绘制线,就组成了网格,多个网格就组成了报表、单据等。那么打印文本呢?哈哈,还是网格,只是一行一列,不用绘制网格线。也许有人要问,我的报表或单据合同之类的太复杂了,能实现吗?回答是肯定的,我们可以通过组合多个网格,合并网格的单元格进行实现。

经过上面的分析,那我们就只要实现一个二维数据的打印和绘制直线或矩形线的两个类就可以实现任意的打印了。在以后的实现中,我们会看到一个IDraw接口,它至少包含一个void Draw()方法,我们要做的这两个核心类继承并实现Draw()。因此我有几个网格就实例化几个这样的对象,调用Draw()就OK了。

在MIS金质打印通中提供了几个默认且常用的对象即Title、Caption、Top、Header、MultiHeader、Body、Footer、Bottom和MisGoldPrinter。大家一看就知道我为什么提供这几个对象,因为在打印报表或单据的时候基本都打印标题、子标题、网格头说明、网格的列标题我叫多层表头(一般中国人为了把表格搞的清晰,网格列标题好复杂,用几行多列并且有些合并单元来说明)、数据网格主体、主体网格注脚说明,Top与Bottom是在它们之上与之下的两个一行三列的对象。而将这些对象组织起来的就是MisGoldPrinter类,灵活的将这些对象管理起来,实现任意复杂的报表及票据等的打印。

以上几个默认常用对象中,Top、Header、MultiHeader、Body、Footer、Bottom都是直接或间接继承于我们的核心类即绘制网格,Title、Caption虽然也可以用一行一列的网格来实现,但是我还是把它另外的实现了。Caption可以设置文本与字体,Title继承于Caption,因为Title还要画两个下划线。

如果要套打(例如网格只打印单元格的文本,网格线不要绘制),在MisGoldPrinter中添加是否套打属性,也可以将套打属性分设在各个对象中,经过判断是否打印标题、多层表头、网格线等,或者用Excel作格式、分析、统计,我们只需将需要打印的数Excel就可以了。

我们设计的思想是:简单快捷,易用实用

例如,我们在窗口上拖一个命令按钮,取名btnPrintEasy,双击后写下如下代码即可以实现网格的打印:

C#:
private void btnPrintEasy_Click(object sender,System.EventArgs e)
{
MisGoldPrinter webmis = new MisGoldPrinter();//打印组件
webmis.Title = "MIS金质打印通\nWWW.WebMIS.COM.CN";//网格标题
webmis.DataSource = this.dataGrid1;//DataGrid作为数据源,或者是任意二维的数组
webmis.Preview();//打印预览
}

VB.Net:
Private Sub btnPrintEasy_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btnPrintEasy.Click
Dim webmis As MisGoldPrinter'打印组件
webmis = New MisGoldPrinter
webmis.Title = "MIS金质打印通"+vbCrLf+"WWW.WebMIS.COM.CN"'网格标题
webmis.DataSource = Me.DataGrid1 'DataGrid作为数据源
webmis.Preview() '打印预览
End Sub

当然,不要忘记了下面的代码,我们要为DataGrid写些测试数据哟。做法是双击窗口空白处,为窗口Form1_Load事件调用,如下:
C#:

private void Form1_Load(object sender,System.EventArgs e)
{
this.dataGrid1.DataSource = this.GetDataSource();
}

private DataTable GetDataSource()
{
DataTable dt=new DataTable();

int rows = 50;
int cols = 6;

//增加行
for (int intRowIndex=0;intRowIndex<rows;intRowIndex++)
{
dt.Rows.Add(dt.NewRow());
}
//增加新列
for (int intColIndex=0;intColIndex<cols;intColIndex++)
{
//dt.Columns.Add(intColIndex.ToString());
dt.Columns.Add();
//填写默认值为空串(.NET TextColumn默认为"空")
dt.Columns[intColIndex].DefaultValue="";
}

int i,j;
for(i=0 ;i< rows ; i++)
{
for(j=0 ;j< cols-3 ; j++)
{
dt.Rows[i][j] = (i + 1).ToString() + "行" + (j + 1).ToString() + "列";
dt.Rows[i][cols-3] = (j + 1).ToString() + "." + (i + 1).ToString();
dt.Rows[i][cols-2] = (i + 1).ToString();
}
dt.Rows[i][cols-1] = (double.Parse(dt.Rows[i][cols-2].ToString()) * double.Parse(dt.Rows[i][cols-3].ToString())).ToString();
}

return dt;
}

VB.Net:
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
Me.DataGrid1.DataSource = Me.GetDataSource()
End Sub

Private Function GetDataSource() As System.Data.DataTable
Dim dt As New System.Data.DataTable
Dim rows,cols As Int32
rows = 50
cols = 6

Dim i,j As Int32
i = 0
While (i < rows)
dt.Rows.Add(dt.NewRow())
i += 1
End While

i = 0
While (i < cols)
dt.Columns.Add()
i += 1
End While

For i = 0 To rows - 1
For j = 0 To cols - 1
dt.Rows(i)(j) = (i + 1).ToString() + "行" + (j + 1).ToString() + "列"
dt.Rows(i)(cols - 3) = (j + 1).ToString() + "." + (i + 1).ToString()
dt.Rows(i)(cols - 2) = (i + 1).ToString()
Next
dt.Rows(i)(cols - 1) = (Double.Parse(dt.Rows(i)(cols - 2).ToString()) * Double.Parse(dt.Rows(i)(cols - 3).ToString())).ToString()
Next

Return dt
End Function


Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
Me.DataGrid1.DataSource = Me.GetDataSource()
End Sub

怎么样?确实不复杂吧?如果我们还想改变标题 Title的字体等,我们都可以很轻松的做到。我们还可以设置子(副)标题、网格的标题、页眉、页脚、网格附加的表头表底的说明。总之,无需您做很多的事情,都可以轻松搞定打印。

我们将在后续的文章中以Step by step的方式,一步一步的结合具体的程序实现打印,等你看完之后,你会觉得:打印,管理信息系统永恒的话题,而我,可以自己实现了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")