7.7 动态显示打印表格
有了前面定义的与业务数据关联的打印表格,用户就可以在完成任务实例时根据需要打印业务表格。如图7.13所示:

图7.13 在执行任务实例时打印业务表格
用户在点击图中打印表格的链接按钮时将弹出显示相关打印表格的页面PrintTable.aspx,其程序代码如下:
......
<form id="Form1" method="post" runat="server">
<table cellSpacing="0" cellPadding="0" width="600" border="0" height="120">
<tr height="60"><td></td></tr>
<tr>
<td align="center"><%=ViewState["PrintedTableName"].ToString()%></td>
</tr>
</table>
<table cellSpacing="0" cellPadding="0" width="600" align="center" border="0">
<tr>
<td><asp:table id="PTable" style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid;
BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid; FONT-FAMILY: 宋体;
BORDER-COLLAPSE: collapse" runat="server" border="1" cellPadding="3"
cellSpacing="0" Width="100%" BorderColor="Gray">
</asp:table>
</td>
</tr>
</table>
</form>
......
PrintTable.aspx.cs文件代码:
......
using DataAccess;
using CommonTools;
namespace workflow.Process
{
public class PrintTable : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Table PTable;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(! IsPostBack)
{
//验证用户是否登录
if(Session["userid"] == null)
Response.Redirect("../Message.aspx");
//接收调用页面时传递的打印表格编号参数
string printedtableid=Request.QueryString["id"].ToString();
//接收业务数据表的标识字段值(确定打印哪一条业务记录)
string identityfieldvalue=Request.QueryString["fieldvalue"];
string strSql="select PrintedTableName,RelatedTable,IdentityField,ColumnsCount
from PrintedTable where PrintedTableID="+printedtableid;
Base basecode=new Base();
DataSet ds=basecode.SQLExeDataSet(strSql);
if(ds == null)
{
Response.Write(basecode.BaseSqlErrDes);
return;
}
ViewState["PrintedTableName"]=
ds.Tables[0].Rows[0]["PrintedTableName"].ToString();
//业务数据表全名称(创建者+表名)
string relatedtable=ds.Tables[0].Rows[0]["RelatedTable"].ToString();
//分割出创建者和表名
string[] tablenamearray=new Tools().StringSplit(relatedtable,".");
//业务表表示字段名
string identityfield=ds.Tables[0].Rows[0]["IdentityField"].ToString();
//打印表格的最大列数
string maxcolumns=ds.Tables[0].Rows[0]["ColumnsCount"].ToString();
//获取业务表字段中文名集合并定义键值对变量(哈希表)
strSql="select FieldName,FieldAlias from RelatedTablesFields where
TableName='"+tablenamearray[1]+"' and TableOwer='"+tablenamearray[0]+"'";
DataSet fieldsaliasds=basecode.SQLExeDataSet(strSql);
if(fieldsaliasds == null)
{
Response.Write(basecode.BaseSqlErrDes);
return;
}
Hashtable fieldaliaspairs=new Hashtable();
for(int i=0;i<fieldsaliasds.Tables[0].Rows.Count;i++)
{
fieldaliaspairs.Add(fieldsaliasds.Tables[0].Rows[i]["FieldName"].ToString(),
fieldsaliasds.Tables[0].Rows[i]["FieldAlias"].ToString());
}
//获取业务表字段值集合
strSql="select * from "+relatedtable+" where "+identityfield+"="
+identityfieldvalue;
ds=basecode.SQLExeDataSet(strSql);
if(ds == null)
{
Response.Write(basecode.BaseSqlErrDes);
return;
}
//获取打印表格的每一个打印行格式(包括该行要打印的字段名集合等)
strSql="select * from PrintedRows where PrintedTableID="+printedtableid;
DataSet printedrowsds=basecode.SQLExeDataSet(strSql);
if(printedrowsds == null)
{
Response.Write(basecode.BaseSqlErrDes);
return;
}
TableRow tr;
TableCell tc;
for(int i=0;i<printedrowsds.Tables[0].Rows.Count;i++)
{
//如果某一行是自定义行(如图中备注行等)
if(printedrowsds.Tables[0].Rows[i]["IsSelfDefined"].ToString() == "Y")
{
tr=new TableRow();
tc=new TableCell();
tc.Text=printedrowsds.Tables[0].Rows[i]["SelfDefinedRowName"].ToString();
tc.HorizontalAlign=HorizontalAlign.Right;
tc.Width=Unit.Percentage(16);
tr.Cells.Add(tc);
tc=new TableCell();
tc.ColumnSpan=int.Parse(maxcolumns)*2;
tr.Cells.Add(tc);
if(printedrowsds.Tables[0].Rows[i]["RowSpan"] != DBNull.Value
& printedrowsds.Tables[0].Rows[i]["RowSpan"].ToString().Trim() != "")
tr.Height=Unit.Pixel(20*int.Parse(printedrowsds.Tables[0]
.Rows[i]["RowSpan"].ToString()));
else
tr.Height=Unit.Pixel(20);
PTable.Rows.Add(tr);
}
else//如果是打印业务字段值的行
{
//分割出打印行要打印的字段(打印行要打印的字段以逗号隔开)
string[] rowfieldsname=new Tools().StringSplit(printedrowsds.Tables[0]
.Rows[i]["IncludedFields"].ToString(),",");
tr=new TableRow();
//Length-1因为打印行的打印字段字符串最后以逗号结束
for(int j=0;j<rowfieldsname.Length-1;j++)
{
tc=new TableCell();
tc.Text=fieldaliaspairs[rowfieldsname[j]].ToString();//字段中文名
tc.HorizontalAlign=HorizontalAlign.Right;
tc.Width=Unit.Percentage(16);
tr.Cells.Add(tc);
tc=new TableCell();
tc.Text=ds.Tables[0].Rows[0][rowfieldsname[j]].ToString();//字段值
if(j==rowfieldsname.Length-2)//该行最后一列
tc.ColumnSpan=int.Parse(maxcolumns)*2-(j*2);
tr.Cells.Add(tc);
}
if(printedrowsds.Tables[0].Rows[i]["RowSpan"] != DBNull.Value
& printedrowsds.Tables[0].Rows[i]["RowSpan"].ToString().Trim() != "")
tr.Height=Unit.Pixel(20*int.Parse(printedrowsds.Tables[0]
.Rows[i]["RowSpan"].ToString()));
else
tr.Height=Unit.Pixel(20);
PTable.Rows.Add(tr);
}
}//打印表格行的for循环结束
}//if(! IsPostBack)
}
}
}