马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

asp.net网页打印使用ie组件(webbrowser)的实现

[复制链接]
查看11155 | 回复3 | 2014-8-22 13:11:50 | 显示全部楼层 |阅读模式
        项目需要,开发个asp.net的工作流系统,自己负责了个网页打印、网站登录的模块。
        A:网站登录模块比较简单,不过在项目中实现代码不能像以前那般随意了,在数据库连接查询部分我增加了异常捕获代码(能增加代码的安全性和健壮性)。我主要登录验证思路如下:1,获取用户输入的账户名和密码;2,根据账户名访问数据库,返回对应账户的密码;3,密码匹配,并给出登录结果(成功则进入主页,失败提示并保持登录界面)。
       过程中,异常捕获模块由于是第一次使用,对于错误信息的处理经验不足,最后决定采用windows form下的弹出窗提示异常错误信息,由于默认类的名称空间中没有相应的引用,需要自己独立添加引用system.windows.form。右键单击解决方案下的自己工程下的引用,点击添加引用。或者在project菜单下找到添加引用。异常处理部分代码如下:
        public string   sql_select_for_pwd(string strSQL)
        {
            try
            {
...
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;                                                    //错误信息的捕获               
               System.Windows.Forms.MessageBox.Show("数据库匹配密码失败:" + ErrorMessage);    //需要添加引用system.windows.form
                return null;
            }
            finally
            {
...
            }
            return null;

        }

另外自己在查找数据库中密码时也思考了一段时间,密码匹配需要取出数据库中特定列的数据,在网上有查到两种方法,一种是采用dataset,将数据库中的内容映射到内存中,使用dataAdapter与数据池交互,因为不太熟悉而且显得复杂,所以我采用了第二种方法:Reader(),上次我采用这个方法计算数据库中的总记录数,现在我用它查找特定列的值,代码如下:
                    ConnectMysql();...
                    mycommand = myconnection.CreateCommand();
                    mycommand.CommandText = strSQL;
                    MySqlDataReader read = mycommand.ExecuteReader();
                    while (read.Read())
                    {
                        pwd = (string)read["Password"];
                    }

                    return pwd;
...
        public string logintestPWD(string username)
        {
            DBdata db = new DBdata();
            string str = string.Format("select *from useradmin where userName='{0}'",username);
            pwd = db.sql_select_for_pwd(str);

            return pwd;   
        }
然后可以进行登录了,登录控件我使用了验证控件requiredfieldvalidator,由于与vs2013的.net4.5存在兼容性问题,需要更改web.config的配置,我增加了如下一段代码:
  <appSettings>
       <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
  </appSettings>
现在我的登录模块基本要点总结完毕。下面我总结一下我使用的web打印方法。
        B:web打印(webbrowser/webprint/ie)实现, 在网上查到有很多第三方控件或称组件什么的,我还认识不深刻,下载下来后是个.cab的数字签名相关的包,里面有.dll和.ocx文件等,我不知道怎么使用到项目工程中,而且编码是在aspx前台做html的编码,我对html没有过多的接触,所以卡在了如何使用第三方控件开发一个网页打印的功能按钮上,早上上班发现了用ie里面的打印组件还是更容易一点,虽然只是完成了打印功能,没有用到特别好用的技术,也没有考虑用户体验,不过对于刚踏入公司的我来说,完成功能即为所学。
        在添加打印控件时,我没有用到第三方的控件,而是直接在aspx的前台插入了部分html代码,调用ie自带的打印功能实现了网页的打印,下面我将这部分简短的代码为大家解读一下:
<body>
    <form id="form1" runat="server">
        <div>
            我是要打印的内容!!!
        </div>      
        <div >
           <style>@media print {.btn{display: none;}}</style>这么分代码主要是实现打印内容不包含class=“btn”的html控件,这儿既是下面的btnPrint
            <input id="btnPrint" type="button" value="打印" class="btn" />   调用webprint默认的打印方法,其中class=“btn”指定了此控件不出现在打印的网页内容中      
        </div>
        <div id="WebBrowser">
            <object id="WebPrint" name="WebPrint" width="0" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>指定使用webprint对象,html5中警告object没有classid,问题没有解决,不过不影响正常使用打印控件
        </div>

    </form>
</body>
到此html代码部分搞定,由于ie默认不允许未经签名许可的activeX运行在ie中,下面需要更改ie浏览器的相关设置,使允许打印按钮完成对ie打印组件的调用,方法是internet选项->安全->选中网络图标然后点击‘详细’->设置所有activeX为允许(有效)状态,如下图所示:

1.PNG 由于我使用的是日文操作系统,菜单选项中文系统会有所差异,不过意到即可,大家自己可以找到设置的选项卡的。上图只是包含了部分activeX设置的图片,下面与activeX相关的都选择有效(允许)。
       现在大家可以打印网页中的内容了。然后我将过程中其他遇到的问题说明一下:1,打印时我遇到默认情况下打印页面存在页眉页脚的问题,去掉打印网页时的页眉页脚的方法是点击打印按钮后,弹出的打印框里点击设置,将页眉页脚内容设置为空即可,如下图所示:

2.PNG 设置完成即可打印网页所需内容,不包含页眉页脚,也可设置自己的页眉页脚打印输出。
2,我在网上下载了lodop和jartoolsprinter,不知道该如何应用到自己编写的aspx网页中,目前还没有找到可行的方法,欢迎各位回帖指导。






ibcadmin | 2014-8-22 16:38:39 | 显示全部楼层
为嘛不是中文的
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
songyusb | 2014-8-22 16:41:21 | 显示全部楼层
我就是来凑个热闹
vvsse | 2014-8-23 09:42:04 | 显示全部楼层
人工置顶 新人求罩
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则