电信 教育 政务 机械 汽车 船舶 交通 石化 烟草 服装 电力 金融 外贸 冶金 电子

3Com小型局域网络组网方案

2004-8-20 发布方:3com 网友评论 0 条 点击进入论坛

3. 自定义控件及类库

3.1 DataGridPro控件
  在前文中介绍如何编写新的模块时我们曾经提到一个用于显示数据的自定义表格控件DataGridPro,下文中我们将对它进行详细说明。

  如果我们要在HTML网页上用表格形式显示数据如图7,相信并不是一件难事。

  但是想要获得诸如鼠标拖动改变表格列宽、滚动表格时保持表头固定、单击选中表格一行等在一般Windows程序中极易实现的表格功能,就不是那么容易了。这主要是因为在HTML网页上生成表格必须通过标准的HTML语言,而动态改变表格的外观则需通过对DHTML提供的对象模型进行脚本编程来实现。由于受到对象模型本身的限制,我们必须通过编写复杂的脚本才能实现在Borland C++、Visual Basic或Delphi中提供的表格控件所具有的基本功能。

    本节将介绍一个在Web页面中实现数据表格常用功能的控件DataGridPro如图8所示。DataGridPro基于.NET Framework中用户自定义控件技术实现。下面分别从DataGridPro在服务器端和客户端使用的技术和提供的功能来作以介绍。

图7 HTML网页一般表格形式

图8 DataGridPro控件


    在服务器端主要实现表格数据的缓存和对选中行的保存。

1) 表格数据的缓存
  当表格要显示的数据量很大时,一次性全部加载需要很长的时间。这其中主要涉及到两个过程:从数据库中取数据和根据数据生成HTML格式的表格并传输个客户端浏览器以显示给用户。.NET Framework提供的标准服务器控件DataGrid提供了分页来解决这个问题。

  DataGridPro 采用了一种类似分页但却令用户觉察不到分页的加载数据方法,如图9所示。具体地说就是在第一次加载数据时仅仅加载第一页的数据,当用户需要浏览更多数据而拉动垂直滚动条时,引发页面提交动作并请求服务器加载更多的数据。DataGridPro中实际上包装了DataGrid控件,而每次加载页面实际上是通过DataGridPro提供的分页功能来实现的:设第i次页面大小为sizei则第i+1次加载时页面大小为sizei+1=sizei+size1这样做实际上使得上面所提到的在表格中显示数据所经历的第二个过程并非一次完成而缩短时间。由于表格数据可能会被多次加载,DataGridPro自动将数据源缓存在服务器的内存中,这样不必每次都从数据库中取数据而减小了表格显示数据所经历的第一个过程需要的代价。    
   
图9 DataGridPro加载数据方法

2) 选中行集的保存
  为了实现用户单击选中一行的功能,必须将用户选中的行集保存在页面中。但是由于HTTP协议是不保持连接的所以HTML页面是无状态的,Session对象虽然为每个用户会话提供了状态,但是页面状态的保存在过去的脚本语言中仍然是个问题,那时程序员通常使用隐藏的输入文本框或查询字符串来维持页面状态。.NET Framework中为隐藏的文本框保存页面状态提供了专门的函数Page.RegisterHiddenField(),同时也通过隐藏文本框实现了一个用于保存页面状态的对象--Page.ViewState.这样对用户单击一行的处理就可以在服务器端完成并将处理结果(选中行集)以数组形式保存在ViewState中。

  DataGridPro在客户端主要实现对客户操作的一些动态响应,包括鼠标拖动改变表格列宽、表格内容滚动时表头位置始终固定、表格大小和位置的设定、响应用户双击事件、设置标示列方便用户选择等。

  DataGridPro采用了behavior技术来实现。Behavior是一种将对象行为和函数封装起来的组件。

3) 鼠标拖动改变表格列宽
  实现这一功能首先要能够确定鼠标的位置是否在表格列分割线附近,这是通过mousemove事件中给出的offsetX来进行判断的。由于在DHTML中我们可以动态改变对象的属性,所以可以根据鼠标移动的相对距离来确定表格新的列宽并实现动态改变。

4) 表格内容滚动时保持表头位置
  DataGridPro中使用如下办法:在behavior中为表格复制一个新的表头。这个表头和原有表头格式及内容完全相同,但它被放在一个新建的HTML元素DIV(是用来划定一部分区域并在其中显示所包含的HTML元素)中,并且其zIndex只比原有表格的zIndex大。

5) 响应用户双击事件
  解决这个问题的关键是如何在存在双击事件的情况下先提交双击事件而后再提交单击事件。   DataGridPro中为单击事件的提交设置一个延时(通过一个客户端的定时器来实现),这个延时至少要长于双击事件比单击事件延迟的那一段时间。这样我们在服务器端可以分别相应单击和双击事件并提供给DataGridPro的用户。

  DataGridPro实现了数据表格的许多常用功能,对它的使用却是十分简单而方便的。由于DataGridPro本身是用户自定义控件,在编写程序时可以使用设计视图下的拖放操作来新增一个DataGridPro,其数据绑定与DataGrid控件非常相似,新增功能则完全可以通过对其属性的访问和事件的响应来获得。

3.2 DataTransformService组件简介
  我们知道在.NET framework提供的类库中对数据库的操作一般是通过DataSet来实现的。
  DataSet可以非常方便的转化为XML文档。但是在实际应用中,我们往往需要将DataTable中存储的数据表以多种数据格式输出。DataTransformService是一个用Visual Basic.NET编写的数据转换组件。其输入为DataTable的实例,输出可为Access(*.mdb)、Excel(*.xls,*.csv)和XML(*.xml)等文件格式。DataTransformService组件利用SQL Server本身提供的DTS服务可以方便快捷的实现数据的分发和转存。

3.3 通用类库简介
  NET framework提供了许多功能强大的类库,但是对于开发具有多窗口、多框架(frame)且以SQL Server作为后台数据库的Web应用程序,就需要有针对这种程序特点的类库来提供支持。下文中将介绍的JSUtil、UIUtil、DBShell等类分别封装了对客户端脚本、用户界面、SQL Server数据库的访问。

  通用类JSUtil提供一系列静态函数,方便用户在服务器端注册客户端的javascript脚本;通过在服务器端注册客户端脚本来执行一些客户端的脚本操作,如关闭窗口、弹出网页对话框、提交表单等等。

  通用类UIUtil提供对用户界面、Web窗体控件进行操作的静态函数,例如改变Toolbar按钮文字及图片等。
  DBShell封装了对SQL Server数据库的存取操作。我们知道使用System.Data.SqlClient命名空间中的类来存取SQL Server数据库一般来说只需要连接字符串和SQL语句即可。DBShell就是一个封装了对SqlConnection、SqlCommand、SqlDataAdapter、DataSet的初始化及存取操作的类,只需在DBShell的构造函数中提供一次连接字符串,以后执行SQL语句仅提供语句本身即可。所有取得的表存储于DBShell的theDataSet属性中,使用起来非常方便。

4. 结束语
  "工欲善其事,必先利其器。"本文所介绍的是Hexiesoft.NET工程架构,它是一款Web控件组合和Web工程架构的集成包(含全部源编码和注释),用于基于.NET下的Web应用程序开发,适合软件项目开发和软件产品制造,可以有效地加快项目开发和提高产品质量,是国内最新的专门针对Web开发的集成包,为采用Visual Studio.NET开发Web应用程序的最佳解决方案。

  利用本文介绍的Hexiesoft.NET工程架构不仅可以快速开发具有层次结构的企业级Web应用程序,缩短系统分析、主程序构建、人员培训等过程,提高开发进度,还能够为应用程序提供简洁明快的风格和方便友好的界面。由于该工程架构提供的是最基本的支持功能,所以在开发ERP、CRM、SCM、PDM和OA等多种信息管理系统时都可以直接应用,并且完全能够重用。

  采用统一的架构系统,使Web工程的模块化大大提高,有利于划分任务;多人协同作业,从另一个方面又提高了生产率。充分而恰当的利用这些工具,应该针对不同应用的特点合理使用。

  本文所提及的Web应用程序Demo是Hexiesoft.NET工程架构在ERP项目中的应用实例,欢迎您访问.NET下的Demo Web应用程序:WWW.hexiesoft.NET 用户名(U):guest 密码(P):guest 。

  最后,有关Hexiesoft.NET工程架构的其他信息您可参考本期杂志彩色扉页,感谢您阅读本文。

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
相关案例
解决方案速查(共有 14387 个方案)
基础软件
安全保密
管理软件
办公软件
软件开发
系统网络
图形多媒体
辅助设计
行业专用
教育教学
电子政务
其他软件
接入
通信
网络
存储
IT服务
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail
赞助商链接