使用mshtml为html文件写入数据[代码]

最近要做的一个界面,由于数据太多且涉及到多个主子关联的表,朋友说用四个DataGrid绑定数据并实现与查询条件的联动,太麻烦而且界面肯定不好看,我用mshtml改造成这样了。

 


 

未加载数据的窗体



加载数据后的窗体


步骤:1)用Macromedia Dreamweaver生成一个名为fsallcondition.htm的html文件,源码如下:
 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>废水排放情况统计</title>
<style type="text/css">
<!--
body 
{
    margin-left
: 0px;
    margin-top
: 0px;
    margin-right
: 0px;
    margin-bottom
: 0px;
}

-->
</style>
<script language="JavaScript" src="../includes/js/common.js"></script>

<script language="javascript">
  
function printsetup()
    
{
      
// 打印页面设置
        wb.execwb(8,1);
  }

  
function printpreview()
    
{
      
// 打印页面预览
      wb.execwb(7,1);  
  }

  
function printit()
  
{
      
if (confirm('您确定要打印本文档吗?')) 
        
{
            wb.execwb(
6,6);
        }

  }

</script>
<link href="../includes/css/main.css" rel="stylesheet" type="text/css">
</head>

<body>
<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
<table width="100%" height="100%"  border="0" cellpadding="0" cellspacing="0">
  
<tr>
    
<td align="center" valign="top"><table width="80%"  border="0" cellspacing="0" cellpadding="0">
      
<tr>
        
<td width="56%"><br>
          
<br><table width="806px"  border="0" cellpadding="0" cellspacing="0" class="tableborder">
          
<tr>
            
<td width="83" class="tdrbborder">&nbsp;排污口编号</td>
            
<td id="pwkbh" width="107" class="tdrbborder">&nbsp;</td>
            
<td width="85" class="tdrbborder">&nbsp;排污口名称</td>
            
<td id="pwkmc" width="120" class="tdrbborder">&nbsp;</td>
            
<td width="77" class="tdrbborder">&nbsp;排污口位置</td>
            
<td id="pwkwz" width="136" class="tdrbborder">&nbsp;</td>
            
<td width="77" class="tdrbborder">&nbsp;排放去向</td>
            
<td id="pfqx" width="120" class="tdbborder">&nbsp;</td>
          
</tr>
          
<tr class="font9">
            
<td class="tdrbborder">&nbsp;接纳水体类别</td>
            
<td id="jnstlb" class="tdrbborder">&nbsp;</td>
            
<td colspan="2" class="tdrbborder">&nbsp;新建项目名称及建设日期</td>
            
<td id="xjxmmcjjsrq" colspan="4" class="tdbborder">&nbsp;</td>
            
</tr>
          
<tr class="font9">
            
<td class="tdrbborder">&nbsp;监控仪器</td>
            
<td id="jkyq" colspan="7" class="tdbborder">&nbsp;</td>
            
</tr>
          
<tr class="font9">
            
<td class="tdrbborder">&nbsp;执行标准</td>
            
<td id="zxbz" colspan="7" class="tdbborder">&nbsp;</td>
            
</tr>
          
<tr class="tdbborder">
            
<td id="pwkzxbz" colspan="8" class="tdbborder">&nbsp;<strong>排污口执行标准:</strong><br><br>
              
            
</td>
            
</tr>
          
<tr class="font9">
            
<td colspan="8"><br>
              
&nbsp;<strong>允许排放量:&nbsp;&nbsp;&nbsp;</strong>
              
<div id="pwxkzbh" style="width:200px; line-height:18pt; font:9pt">&nbsp;&nbsp;[排污许可证编号——]</div></td>
            
</tr>
          
<tr class="font9">
            
<td colspan="8" class="tdbborder"><table id="tblYXPFL" width="90%"  border="0" align="center" cellpadding="0" cellspacing="0" class="tabletbborder">
              
<tr>
                
<td width="20%" class="tdrbborder">&nbsp;污水允许排放量</td>
                
<td width="27%" class="tdrbborder">&nbsp;污染物</td>
                
<td width="26%" class="tdrbborder">&nbsp;许可浓度</td>
                
<td width="27%" class="tdbborder">&nbsp;许可排放量</td>
              
</tr>
            
</table>
              
<br></td>
            
</tr>
          
<tr class="font9">
            
<td colspan="5" valign="top"><br>
              
&nbsp;<strong>污水排放情况:</strong>
              
<div id="pfzl" style="width:200px; line-height:18pt; font:9pt">&nbsp;&nbsp;[排放总量——]</div></td>
            
<td colspan="3" valign="top"><br>
              
&nbsp;<strong>指标监测情况:</strong></td>
            
</tr>
          
<tr class="font9">
            
<td colspan="5" valign="top"><table width="95%"  border="0" align="center" cellpadding="0" cellspacing="0" class="tabletbborder">
              
<tr>
                
<td width="28%" class="tdrbborder">&nbsp;污染物</td>
                
<td width="16%" class="tdrbborder">&nbsp;实际浓度</td>
                
<td width="17%" class="tdrbborder">&nbsp;达标排放量</td>
                
<td width="17%" class="tdrbborder">&nbsp;超标排放量</td>
                
<td width="22%" class="tdbborder">&nbsp;合计</td>
              
</tr>
              
<tr>
                
<td>&nbsp;</td>
                
<td>&nbsp;</td>
                
<td>&nbsp;</td>
                
<td>&nbsp;</td>
                
<td>&nbsp;</td>
              
</tr>
            
</table>
            
<br></td>
            
<td colspan="3" valign="top"><table width="95%"  border="0" align="center" cellpadding="0" cellspacing="0" class="tabletbborder">
              
<tr>
                
<td width="48%" class="tdrbborder">&nbsp;污染物</td>
                
<td width="22%" class="tdrbborder">&nbsp;检测浓度</td>
                
<td width="30%" class="tdbborder">&nbsp;检测标准浓度</td>
              
</tr>
              
<tr>
                
<td>&nbsp;</td>
                
<td>&nbsp;</td>
                
<td>&nbsp;</td>
              
</tr>
            
</table><br></td>
            
</tr>
        
</table></td>
        
</tr>
      
<tr>
        
<td>&nbsp;</td>
        
</tr>
      
<tr>
        
<td>&nbsp;</td>
        
</tr>
    
</table></td>
  
</tr>
</table>
</body>
</html>

关键是:为每个数据区域(Td和Div)定义一个ID,以便在程序中进行引用。

2)建立WinForm窗体,引用Microsoft.mshtml,使用Microsoft Web浏览器加载html文件,"查询"按钮用于调用向html文件中写数据的过程,"页面设置"、"打印预览"及"打印"按钮用以调用html文件中的javascript完成相应的功能。源码如下:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace HC.WinForm
{
    
/// <summary>
    
/// frm_废水所有信息 的摘要说明。
    
/// </summary>

    public class frm_废水所有信息 : System.Windows.Forms.Form
    
{
        
private System.Windows.Forms.Panel panel1;
        
private System.Windows.Forms.Label label1;
        
private System.Windows.Forms.ComboBox cmbPWK;
        
private System.Windows.Forms.DateTimePicker dateTimePicker1;
        
private System.Windows.Forms.Label label2;
        
private System.Windows.Forms.Label label3;
        
private System.Windows.Forms.RadioButton radYear;
        
private System.Windows.Forms.RadioButton radMonth;
        
private System.Windows.Forms.Label label4;
        
private System.Windows.Forms.Button btnQuery;
        
private System.Windows.Forms.Button btnExit;
        
private AxSHDocVw.AxWebBrowser awbMain;
        
private System.Windows.Forms.Button button3;
        
private System.Windows.Forms.Button btnPS;
        
private System.Windows.Forms.Button btnPP;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        [STAThread]
        
static void Main() 
        
{
            Application.Run(
new frm_废水所有信息());
        }


        
//单位编号
        private string strunit = "";

        
//计数器,记录页面加载的次数
        private int intLoadTimes = 0;

        
public string strUnit
        
{
            
get
            
{
                
return this.strunit;
            }

            
set
            
{
                
this.strunit = value;
            }

        }


        
private mshtml.IHTMLDocument2 doc = null;

        
private System.Runtime.InteropServices.Expando.IExpando ex;

        
private mshtml.IHTMLWindow2 win = null;


        
public frm_废水所有信息()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();

            
//
            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            
//
        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if(components != null)
                
{
                    components.Dispose();
                }

            }

            
base.Dispose( disposing );
        }


        
Windows 窗体设计器生成的代码

        
/// <summary>
        
/// 为cmbPWK绑定数据
        
/// </summary>

        private void SetUnitCombo()
        
{
            
string strSQL = "SELECT 排污口编号, 排污口名称 FROM [PW_废水排污口] WHERE (所属单位 = '" + this.strUnit + "') ORDER BY 排污口编号";

            System.Data.DataSet dsUnit 
= HEWin.Sys.sysDb.GetDataSetBySql(strSQL, "废水排污口");

            
this.cmbPWK.DataSource = dsUnit.Tables["废水排污口"];

            
this.cmbPWK.DisplayMember = "排污口名称";

            
this.cmbPWK.ValueMember = "排污口编号";

            dsUnit.Dispose();
        }



        
/// <summary>
        
/// 排污口基本情况,最多只有一行数据
        
/// </summary>

        private string SetBasicInfo()
        
{
            
string strRet = "";

            
string strSQL = "SELECT 排污口编号, 排污口名称, 排污口位置, 排放去向, 排放标准, 接纳水体功能类别 AS 接纳水体类别, 最近建设项目名称及建设日期 AS 新建项目名称及建设日期, 监控仪器, 执行标准 FROM [CX_排污口基本情况] WHERE (排污口编号 = '" + this.cmbPWK.SelectedValue.ToString() + "')";

            System.Data.DataSet dsBasicInfo 
= HEWin.Sys.sysDb.GetDataSetBySql(strSQL, "排污口基本情况");

            
if (dsBasicInfo.Tables["排污口基本情况"].Rows.Count == 0)
            
{
                
this.win.execScript("showMD(\"环境检测管理系统\", \"errnounit.htm\", true, false, false)""javascript");
                
return strRet;
            }


            strRet 
= dsBasicInfo.Tables["排污口基本情况"].Rows[0]["排放标准"].ToString();

            mshtml.IHTMLElement2 eleTd 
= (mshtml.IHTMLElement2)doc.all.item("pwkbh"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["排污口编号"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("pwkmc"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["排污口名称"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("pwkwz"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["排污口位置"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("pfqx"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["排放去向"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("jnstlb"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["接纳水体类别"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("xjxmmcjjsrq"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["新建项目名称及建设日期"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("jkyq"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["监控仪器"].ToString() + "</font>";

            eleTd 
= (mshtml.IHTMLElement2)doc.all.item("zxbz"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= "&nbsp;<font color='blue'>" + dsBasicInfo.Tables["排污口基本情况"].Rows[0]["执行标准"].ToString() + "</font>";

            dsBasicInfo.Dispose();

            eleTd 
= null;

            
return strRet;

        }



        
/// <summary>
        
/// 执行标准
        
/// </summary>
        
/// <param name="执行标准"></param>

        private void SetExecStandard(string 执行标准)
        
{

            
if (执行标准 == "")
                
return;

            
string strSQL = "SELECT 执行标准编号, 执行标准 FROM [CX_废水执行标准] WHERE (执行标准编号 = '" + 执行标准 + "')";

            
string strIH = "&nbsp;<strong>排污口执行标准:</strong><br><center><font color='blue'>";
            
            System.Data.DataSet dsES 
= HEWin.Sys.sysDb.GetDataSetBySql(strSQL, "废水执行标准");

            
if (dsES.Tables["废水执行标准"].Rows.Count == 0)
            
{
                strIH 
+= "无执行标准";    
            }

            
else
            
{
                
for(int i = 0; i < dsES.Tables["废水执行标准"].Rows.Count; i ++)
                    strIH 
+= dsES.Tables["废水执行标准"].Rows[i]["执行标准"].ToString().Replace(" ""&nbsp;"+ "<br>";
            }


            strIH 
+= "</font></center>";

            mshtml.IHTMLElement2 eleTd 
= (mshtml.IHTMLElement2)doc.all.item("pwkzxbz"null);

            ((mshtml.HTMLTableCellClass)eleTd).innerHTML 
= strIH;

        }



        
        
/// <summary>
        
/// 允许排放量
        
/// </summary>

        private void SetYXPFL()
        
{
            
string strSQL = "SELECT 许可证编号, 污水允许排放量, 污染物, 许可浓度, 许可排放量 FROM [CX_废水允许排放量] WHERE (排污口编号 = '" + this.cmbPWK.SelectedValue.ToString() + "') ORDER BY 污染物";

            System.Data.DataSet dsYXPFL 
= HEWin.Sys.sysDb.GetDataSetBySql(strSQL, "允许排放量");

            
string strScript = "";

            mshtml.IHTMLElement2 eleDiv 
= (mshtml.IHTMLElement2)doc.all.item("pwxkzbh"null);

            
if (dsYXPFL.Tables["允许排放量"].Rows.Count == 0)
            
{
                
//没有污水允许排放量时的处理

                strScript 
= "var rowNew = tblYXPFL.insertRow();";

                
//污水允许排放量
                strScript += "var tdWSYXPFL = rowNew.insertCell();";

                
//设置单元格的ColSpan为4
                strScript += "tdWSYXPFL.colSpan = 4;";

                strScript 
+= "tdWSYXPFL.innerHTML = '<center><font color=blue>——————————————</font></center>';";

                
this.win.execScript(strScript, "javascript");

                ((mshtml.HTMLDivElementClass)eleDiv).innerHTML 
= "&nbsp;&nbsp;[排污许可证编号——<font color='red'>无</font>]";
            }

            
else
            
{

                ((mshtml.HTMLDivElementClass)eleDiv).innerHTML 
= "&nbsp;&nbsp;[排污许可证编号——<font color='red'>" + dsYXPFL.Tables["允许排放量"].Rows[0]["许可证编号"].ToString() + "</font>]";
                
                
if (dsYXPFL.Tables["允许排放量"].Rows.Count > 1)
                
{
                    
/*    执行Script为表添加数据行、单元格及单元格格式与数据
                     *    由于受单元格样式不同的影响,此处只添加表行数-1行数据
                     *    此循环后的代码添加最后一行数据
                     *    如果只有一行数据,不执行下面的循环
                     
*/

                    
for (int i = 0; i < dsYXPFL.Tables["允许排放量"].Rows.Count - 1; i++)
                    
{
                        strScript 
= "var rowNew = tblYXPFL.insertRow();";
                        
//污水允许排放量
                        strScript += "var tdWSYXPFL = rowNew.insertCell();";
                        strScript 
+= "tdWSYXPFL.className = 'tdrbborder';";
                        strScript 
+= "tdWSYXPFL.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[i]["污水允许排放量"].ToString() + "</font>';";
                        
//污染物
                        strScript += "var tdWRW = rowNew.insertCell();";
                        strScript 
+= "tdWRW.className = 'tdrbborder';";
                        strScript 
+= "tdWRW.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[i]["污染物"].ToString() + "</font>';";
                        
//许可浓度
                        strScript += "var tdXKND = rowNew.insertCell();";
                        strScript 
+= "tdXKND.className = 'tdrbborder';";
                        strScript 
+= "tdXKND.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[i]["许可浓度"].ToString() + "</font>';";
                        
//许可排放量
                        strScript += "var tdXKPFL = rowNew.insertCell();";
                        strScript 
+= "tdXKPFL.className = 'tdbborder';";
                        strScript 
+= "tdXKPFL.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[i]["许可排放量"].ToString() + "</font>';";

                        
//执行上面的SCRIPT
                        this.win.execScript(strScript, "javascript");
                    }

                }


                strScript 
= "var rowNew = tblYXPFL.insertRow();";
                
//污水允许排放量
                strScript += "var tdWSYXPFL = rowNew.insertCell();";
                strScript 
+= "tdWSYXPFL.className = 'tdrborder';";
                strScript 
+= "tdWSYXPFL.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[dsYXPFL.Tables["允许排放量"].Rows.Count - 1]["污水允许排放量"].ToString() + "</font>';";
                
//污染物
                strScript += "var tdWRW = rowNew.insertCell();";
                strScript 
+= "tdWRW.className = 'tdrborder';";
                strScript 
+= "tdWRW.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[dsYXPFL.Tables["允许排放量"].Rows.Count - 1]["污染物"].ToString() + "</font>';";
                
//许可浓度
                strScript += "var tdXKND = rowNew.insertCell();";
                strScript 
+= "tdXKND.className = 'tdrborder';";
                strScript 
+= "tdXKND.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[dsYXPFL.Tables["允许排放量"].Rows.Count - 1]["许可浓度"].ToString() + "</font>';";
                
//许可排放量
                strScript += "var tdXKPFL = rowNew.insertCell();";
                strScript 
+= "tdXKPFL.innerHTML = '&nbsp;<font color=blue>" + dsYXPFL.Tables["允许排放量"].Rows[dsYXPFL.Tables["允许排放量"].Rows.Count - 1]["许可排放量"].ToString() + "</font>';";

                
//执行上面的SCRIPT
                this.win.execScript(strScript, "javascript");
            }


            eleDiv 
= null;

            dsYXPFL.Dispose();
            
        }


        
private void frm_废水所有信息_Load(object sender, System.EventArgs e)
        
{

            
this.strUnit = "001";

            
this.SetUnitCombo();

            
object url = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"html\html\fsallcondition.htm");

            
object r = System.Reflection.Missing.Value;

            
//装载没有数据的页面
            this.awbMain.Navigate2(ref url,ref r,ref r,ref r,ref r);

        }



        
private void btnExit_Click(object sender, System.EventArgs e)
        
{
            
this.Dispose();
        }



        
private void btnQuery_Click(object sender, System.EventArgs e)
        
{

            
/*
             *    每次查询前清空数据,重新加载一遍没有数据的页面即可
             *    此事件中代码不负责具体的查询数据的工作
             
*/
    
            
object url = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"html\html\fsallcondition.htm");

            
object r = System.Reflection.Missing.Value;

            
/*    装载没有数据的页面
             *    Navigate2方法会引发awbMain_DocumentComplete事件
             *    在awbMain_DocumentComplete事件中进行数据的查询
             
*/

            
this.awbMain.Navigate2(ref url,ref r,ref r,ref r,ref r);

        }



        
/// <summary>
        
/// 浏览器加载完毕时的处理事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void awbMain_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
        
{
            
if (this.intLoadTimes == 0)
            
{
                
//第一次加载页面时执行该段代码,减少执行次数(只执行一次)
                this.doc = (mshtml.IHTMLDocument2)this.awbMain.Document;

                ex 
= (System.Runtime.InteropServices.Expando.IExpando)doc;
            
                System.Reflection.PropertyInfo piform 
= ex.AddProperty("MainForm");
            
                piform.SetValue(doc, 
thisnull);

                
this.win = this.doc.parentWindow;
            }

            
/*    在页面中加入了
             *    <OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
             *    组件后引发了两次awbMain_DocumentComplete事件
             *    
             
*/

            
else if (this.intLoadTimes > 2)
            
{
                
//不是第一次加载页面时查询数据
                string strESBH = this.SetBasicInfo();

                
this.SetExecStandard(strESBH);

                
this.SetYXPFL();
            }


            
this.intLoadTimes ++;
        }


        
//调用HTML文件中的Javascript进行页面设置
        private void btnPS_Click(object sender, System.EventArgs e)
        
{
            
this.win.execScript("printsetup();""javascript");
        }


        
/*    调用HTML文件中的Javascript进行打印预览
         *    调出打印预览的窗口是不能最大化的,大小取决于本窗体的大小。
         *    
         
*/

        
private void btnPP_Click(object sender, System.EventArgs e)
        
{
            
this.win.execScript("printpreview();""javascript");
        }


        
private void button3_Click(object sender, System.EventArgs e)
        
{
            
this.win.execScript("printit();""javascript");
        }


    }

}


这个过程中发现的两个问题:
1)在页面中加入了<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>组件后引发了两次awbMain_DocumentComplete事件;

2)调用HTML文件中的Javascript进行打印预览,调出打印预览的窗口是不能最大化的,大小取决于本窗体的大小。

posted @ 2005-04-18 14:28  蜡人张  阅读(8988)  评论(15编辑  收藏  举报