admin 管理员组文章数量: 1184232
2024年4月20日发(作者:学it去培训机构有用吗)
维普资讯
第22卷第1O期
计算机应用
Vo1.22,No.10
2OO2年1O月
Computer Applications
Oct.,2002
文章编号:1001—90 ̄l(Xm)10—0119—03
树型控件与XML和ADO.NET技术在B/S中的应用
余溥澜 ,刘 丽
(1.南开大学中心实验室,天津300071;2.南开大学生命科学学院,天津300071)
摘要:结合XML和ADO.NET数据库访问技术介绍如何在Dot net环境下利用树型控件设计
Web导航页面,给出了提高控件性能的方法。
关键词:树型;XML;.Net,;ADO.net
中图分类号:TP393.09 文献标识码:A
1前言
较容易,但灵活性相对就差一些。后一种方式程序控制较为
复杂但具有最大的灵活性。我们在这里主要介绍的是编程控
由于B/S结构对客户端的要求很低因此越来越得到构架
制。有关前两种方式可以参考文献http://msdn.microsoft.
设计师的喜爱,越来越多的应用程序以B/S结构实现。我们
corn/library/default.asp?url=/workshop/webcontrols/using/
现阶段研发的CRM项目就是基于.Net平台并利用其强大的
designer/t ̄eview.a叩。生成简单树的步骤如下:
数据库访问技术ADO.NET开发。在实现B/S结构时页面之
1)创建Web应用程序;
间的导航非常重要,良好的设计可以使系统成为一个完美的
2)在Web Form中添加控件,这将在代码中自动生成以
整体,各个个体之间的连接非常紧密。一般来说页面之间的
下变量声明:
导航技术有很多种,例如下拉式菜单、下拉列表框、浮动菜单
protected cIDs0ft.Web.UI.WebContwls.T ̄eViewTx ̄eViewl:
以及树型菜单等。在.Net出现以前必须要自己编写复杂的
3)在using语句中加入以下引用
,ascIipt来实现树型菜单。随着微软最新开发平台的发布,
u她Micms0fI.Web.UI.WebCentroh;
这一切都得到了改观,因为微软同时提供了服务端的树型控
4)编辑代码。
件的支持,这使得树型结构导航体系的实现变得简单多了。
本文假定开发使用语言为C撑,如果用VII的话基本过程
本文首先对控件的特性及其使用作一些简述,然后根据实例
是一样的。双击Web Form进入到编码模式加入以下代码:
着重说明怎样结合ADO.NET以及.NET中XML的访问技术
lm ̄tectde void G啪目a rIeef1 view tree)
来增强控件的功能。
(
Tree.Node In=new Tr ̄eNede();
2树型控件介绍
In.Text=”地球”://建立根结点
Tr ̄eNedeInl=newTr ̄Nede();
2.1安装
nI1.Text=”中国..: //根结点的子结点
服务端的树型控件并不包含在.Net的开发平台中,必须
协.Nodes.Add(in1);
到微软网站下载安装以后才能使用,下载地址为http://
T ̄Nodein2=newTr ̄Nede(): //”中国..的子结点
nI2.Text=”北京”:
msdn.microsoft.eom/downloads/ ̄tmplew'intemet/a印--dot—neL
nI1.Nodes.Add(仃I2);
serveax ̄ntrols/webcontrols/default.asp,文件名为iewebeontrols-
nI2=IleW Tn ̄ede():
h2r.msi。下载到本地后直接安装,缺省安装目录为c:、
nI2.Text=”上海I.- //”中国..的子结点
Pr Fries、Miews ̄Web Controls 1.0、。然后打开Visual
nI1.Nodes.Add(仃I2);
Studio.net。打开工具箱,右击选择定制工具箱,选择“.NET
nI2=new Tr ̄Nede();
FraraeworkCompomnts”。再选择浏览,然后添加“Mi嘣 .Web.
nI2.Text=..美国”; //根结点的子结点
协.Nodes.Add(tO.):
UI.Webcontroh.(玎1”,这样就把控件加入了工具箱以备使用。
trd=newTr ̄eNede(); //根结点的子结点
2.2控件包含对象
nI2.Text=”英国”;
控件主要包含三种对象:TreeVicw、TreeNode以及
In.Nodes.Add(in2);
TreeNodeType,这三种对象分别用来编程生成树、树节点以及
h∞.Nodes.Add(in)://将结点加入到树中
定义节点类型。
l
然后再在Pa 巳一_LoBd函数中加入以下代码:
3简单树的生成
if(!Page.IsPostBaek)
(
树型控件的生成支持多种方式,设计时定制、初始化文件
ce∞r8leTTee(Treeview1): //生成显示树
定制以及程序控制定制。前面两种方式比较简单而且实现比
l
收稿日期:2002—07—18(修改稿)
作者筒介:余溥澜(1 3一),男,湖南长沙人,博士,主要研究方向:信息系统、三维分子显示和搜索、CRAM;刘丽(1 一),女,山东青岛人,
硕士,主要研究方向:生物信息技术.
维普资讯
120 计算机应用
tn2=new Tr ̄eNode();
tn2.Text=“上海”:
tn2.NavigateUrl=”/shanghai.aspx‘’:
tn2.Type=”City”:
2OO2卑
编译运行就可以看到生成了一棵以地球为根结点,中、
美、英分别为其子结点,并且中国下面含有北京、上海的树。
这是一棵简单的树,树的结点不包含图形和超连接。要做到
这两点需要通过对TreeNode的一些属性进行设置,或者使用
TreeNodeType来进行更快捷的定制。可以发现安装完树型控
件以后,在服务器端的Web发布目录下会自动地生成
 ̄client\1_0\ 目录,在这个目录之下系统存放
m1.Nodes.Add(tn2);
//下面代码与刚才例子一样
}
…
运行以后就会发现新生成的树比最初的树美观多了,并
了缺省用来定制结点显示的图片,可以选用自己喜爱的任何
图片来定制树结点,我们以系统缺省为例,还是以刚才的例子
且真正具有了导航功能。二者之间的差异在程序中有详细的
注释故不再重复。
来进行说明,对它做一些修改,结果如下:
protected void Gener丑 rIee(TIeeⅥ tree)
(
string 8zIrT1a ”/webetrLclient/1一O/Images/”;
4与数据库结合
表l数据库结构
//图片存放位置
TreeNodeType type=n Tr ̄eNodeType();//定义结点类型
type.Type=--c0衄耐”;//给结点类型命名
type.ImageUrl=szlmage+”folder.g ‘;
字段名称
node-id
数据类型
Ⅱ IDENrI3TYNOTNULL
描述
结点ID
n0de__n衄le
n0de__lay口
node_parent
VARcHAR(255) 结点显示名称
type.E】cpandedI Igeud=szlmage+”foldero ̄.gif’f;
Ⅱ NOT NULL 结点在树结构中的层数
Ⅱ NOTNULL 结点的父结点ID
tree.Tr ̄eNodeTypes.Add(type);
type=nwTreeNodeType();
type.Type=”Gty‘’:
//将类型添加到树中
n0de__iITm萨
node-expandimage
n0de__mt
node_desc
vARcHAR(255) 结点显示图片
type.Im ̄Url= ⅫIge+”htm1.gif”;
tree.TreeNodeTypes.Add(type);
TreeNode hI= TreeNode();
tn.Text=..地球..;
tn.ImageUrl=8zIn1日 +”root.g ’;
VARCHAR(255) 结点展开图片
VARCHAB(255) 结点导向的UP&地址
VAR衄AR(1000) 结点功能描述
//建立根结点
在生成树的过程当中有关的结构信息如果跟上面程序一
样包含在程序代码中,那么当树结构发生变化时,必然要引起
TreeNode tnl=new 0de();
tn1.Text=tt中国”;
tn1.Type=”Country”://将结点定义为Country类型
tn.Nodes.Add(tn1);
TreeNodetn2=new Tlee 0de();
tn2.Text=”北京“:
tn2.Type=”City”:
程序的很大变化。与此同时,当结构信息很多时这样实现的
结果势必造成代码量的膨胀。实际上一般是把结构信息存储
在数据库中,当结构信息发生变化时只需要修改数据库而无
需对程序进行修改。在我们实现 M项目时,采用如表1结
构的数据库。
数据库采用Microsoft SQL Server2000。实际结点存储情况
如表2。
m2.NavisateUrl=”/bejing.aspx”:
tn1.Nodes.A ̄(tn2);
//设定结点的链接地址
表2结点存储情况
.
Net中使用强大的ADO.NET技术来访问数据库,主要使
if((int.Parse(dv【i】.Row【”node-.-layer”】.ToString())==
nhyer)&&(int.Parse(dv[i】.Row【”nod ̄_psl'ent”】.ToString())
==int.Parse(dv[n/./ne】.Row【”nate-id”】.T ̄Sb4ns())))
I
Tr ̄eNode nd=newTreeNode();
用到的对象是OleDbConnection、OleDbC,ommand、DataView,其中
OleDbCamection用来建立与数据库的连接;OleDbCommand用
来表示要执行的命令;DataView表示的是数据视图,可看成是
结果记录集。以下代码实现从数据库中读取结构信息然后动
态生成树结构:
试ec湖void BuildTnee(DataView dv,
int nL 口,Tr ̄eView tar,int nLine, ode node)
I
//增加结点到子结点集合中
BuildTtee(dv,nLayer,心,i.nd);
szUd.Trim();
szUd.ToUr ̄():
int nDeepth=int.Parse
//递归词用生成树
出-啷szUrl=,iv【.】.Row【”node_ud”】.ToSu4ng();
//dr是结构如上表的视图,nLine是记录在视图中的行数,
t L丑y 是当前结点的层数
int nCount;
( 【i】.Row【”node-layer”】.TcLString());
nCount=dv.C汕lt://获得记录数
.Layer++;//层数加一,用于建立子结点
南 (im i=0;i<nCount;i++)
//遍历记录查找当前行结点的子结点
{
if(szUrl!=・・null")
(
//判断是否为叶结点
m4ns szUflStr=dv【i】.Row【”nate-ud”】.ToSu ̄ng();
nd.NavismeUfl= ̄UdStr;
}
维普资讯
第lO期 余溥澜等:树型控件与XML和ADO.NE3"技术在B/S中的应用 l2l
nd.IraageUrl=dv[i】.Row【”node_image”】.ToS ̄ng();
nd.F_ ̄edlmageUrl=dv【i】.Row【”node-expancllnm ̄”】.
ToStrir ̄();
node.Nodes.Add(nd); Ⅱ入结点
)
)
node.Text=dv[nLine】.Row【”node. ̄nglTl@”】.1bS伍ng();
//设置结点显示名称
)
下面函数实现树结构初始化:
州ectcd voidInitTtce()
I
DataTable dt: ∥记录集
舢I硒n=(Ole ̄eetlon)Session[”Se ̄ionCon”】;
dt=C.,etRightTable();
∥调用函数获得当前用户可以使用的模块表
DataView dv=new DataView(dt);
Trce2qode tn;
im nC删=dv.C ̄mt;
f0r(int i=O:i<nGount;i++)
I
//查找第一层结点
int nFstNode=int.parse
(dv[i】.Row【”node-layer”】.ToS ̄ng());
if(nFstN0de==0)
I
In=newTreeNode();
BuildTree(dv,0,TmeViewl,i,tn); //生成树结构
tn.ImageUrt=dv[i】.Row【”n0de__iIT1日 ”】.ToS ̄ng();
tn.gxps ̄edlmagtUrl=dv【i】.Row nodLaq删iII1日Ige”】.
ToString();
tn. par =lxue;
TreeView1.Nodes.Add(In):
)
)
)
5与XML结合
树结构可以如上面一样直接从数据库中读取信息生成,
也可以由数据库信息生成XML文件,然后用XML文件来生
成所需的树结构。目前比较流行使用XML来编写各种配置
或初始化文件。下面结合数据库和XML技术来生成树。本
例主要使用Xmrl'extWriter来生成所需的XML文件,代码如
下:
叫blic void BufldXmlF'de()
I
…
同上面代码一样先获得模块记录集dt.然后生成数据视图
DataView(Iv=new DataView(dt):
)(1 rt嘲W tel'wr=new XmlTextWHter
(”c:、、tree4.xml”,UnicodeEncoding.Unicode);
//一定要设定编码方式否则文件中的汉字都是乱码
wr. 撕ng Fcmattir ̄.Indented;
Ⅵ.WriteStartElement(”TREENODESt・); //建立结点集
BuildTreeXml(dv,0,wr,0);
wl".Writo ̄EndElament();
wr.Flush();
wr.Clase();
Re ⅫIe.Write(”finished”);
)
public void Buihq ̄reeXml(DataView dv,int nLayer,XmlTextWriter wr,
int tiLde)
1
wr.WriteSta.nElement(”treenode”);∥建立树结点
Respom ̄.Wfite(dv[nLine】.Row【”node-name”】.TaString()+
’’<br>’’):
wr.WriteAttributeString(null,’’text”,null,
dv[nLine】.Row【”node__name”】.ToString());
wr.WriteAttributeString(null,”iIT1日 ”,null,
dr[nLine】.Row【”node-image”】.T ̄tring());
Ⅵ.WfiteAttributeString(null,”a m1diInBge”,null,
dv[nLine】.Row【”node_expandimage”】.ToString());
//写入属性
f(dv[nLine】.Row【”node_url”】.T ̄tring()!=”m】ll”)
f
Ⅵ.WriteAttributeString(null,”navigateurl”,null,
dv[nLine】.Row【”node_url”】.ToStrlng());
)
int nCount;
nC0IlrIt=(Iv.Count;
nLayer++:
for(int i=O;i<nCount;i++)
I
if((int.Parse(dv【i】.Row【”node-layer”】.ToSt ̄S())==
nlayer)&&(int.Paine(dr【i】.Row【”no'-parent”】.ToSt=ns())
==im.Parse(dv[nL ̄e】.Row[”node-id”】.ToSt ̄ns())))
I
BuildTreeXml(dv,nLayer,Ⅵ,i);
)
)
wF.WriteKndEltmatmt();
)
生成的XML文件形式如下:
<TREENODES>
<treenode text=”HT-CRM”image=”/images/ro ̄.gif..
ex ̄mage=”/k,. ̄edroot.g >
<treenode text=”客户管理 iIT1日 ”/images/folder.
expandimage=”/in-a ̄s/folderopen. >
<treenode t嘲=”考核管理”image=”/images/folder.gif..
expandimage=”/i瑚8圈/ de 嘲.g ’>
<treemodetext=”考核项管理”im擎=”/im ̄m/htm1. ’
expandimage=”/ ag 砌. ”n g慨lIl=”/
author/stand.aspx”/>
<treenode text=”定制标准”image=”/im /lI .西f.’
expandimage=”/imge&/h劬I.Of”mvigateurl=”/
author/custstand.aspx”/>
</treenode>
</treenode>
<treeno&text=”系统管理”image=”/images/foldre. ”
qpaI n埘 ”/in-a ̄-es/foldempm.g >
<treenode t嘲_I.新建客户’’irn孵 ‘’/im因c8/h . ’
口 IIHge=”/ m日鸭/h .gif”瑚 £ =”/amli/
amli/ ̄dd.aspx”/>
<treenode text=”客户查询”iIT1日 ”/im /lI扛Id.g
qpmdimge ”/ ag hhTd. ”navi ̄eurl=”/ennli/
cnnli/estmQuery.aspx”/>
</treenode>
</treenode>
</TREENODES>
生成XML文件后就可以在设计模式下选择设置树的属
性,将TreeNodeSrc设定为上面生成的XML文件路径就大功告
成了。
维普资讯
第22卷第l0期
2002年l0月
文章编号:1001—9081(2002)10—0122—02
计算机应用
Computer Applications
Vo1.22,No.10
Oct.,2002
Windows 2000下文件监视器的实现
杨 荣
(中国科技大学研究生院电子学部,北京100039)
摘要:介绍了Windows 2000的系统服务的概念,提出利用勾挂系统服务来实现对文件操作的实
时监视,并给出了实现代码。
关键词:系统服务;勾子;文件监视器
中图分类号:TP316.7 文献标识码:A
原因是这些API一般只在系统内部被调用。它们使用il1t 2e
指令来切换到内核模式并执行所请求的系统服务。
在实际工作中,有时候需要编写一个文件监视器对系统
的文件操作进行实时监视,最典型的应用就是反病毒软件。
在Windows 98下可以通过hook API技术来实现,也就是将自
己的监控代码挂接在系统文件操作API的入口处。由于在
Windows 98下所有进程共享系统皿的二进制映像,所以软件
可对所有进程下的文件操作进行监控。但在Windows 2OO0
下,上述方法则不再有效。原因是各进程中的系统皿映象并
不共享,一个进程对API的修改对另一个进程毫无影响。因
此在Windows 2OO0下文件监视器的实现需要新的方法。一种
图l
方法是编写一个文件系统设备驱动程序。该驱动程序属于过
滤型的驱动程序,可以看到文件系统所有的IRP包和快速10
W'm32API函数(主要是在kernel32.皿和advAPI32.皿中
的函数)使用这些wrapper来调用系统服务,W'm32API函数自
己主要是对参数进行有效性检查,并把它们转换为unicode形
式。之后API根据需要调用ntdll中相应的wrapper函数。在
ntoskml中的系统服务是用服务II)号来区分的。Wrapper函数
在eax寄存器中存放所要调用的系统服务II)号,edx中存放
用户态堆栈指针,然后发出im 2e指令。处理器根据中断号
在系统中断描述符表(roD)中找到中断处理函数的起始地址,
开始执行。该中断处理函数根据edx的值,将参数从用户态
堆栈拷贝到核心态堆栈。根据e缸中的服务II)号,查询系统
服务分配表SSDT(System sen,ice Dispatch I Ie)来获得服务函
数的地址。该表包含两个字段,一个存放系统服务II)号,另
一
请求。驱动程序在内部建立一个HASH表,当遇到打开文件、
创建文件或关闭文件的调用时,就更新该表,以便在内部文件
句柄与文件路径名之间建立映射。以后就可根据各个 中
的句柄知道该 中的数据是属于哪个文件的了。另一种方
法是采用hook servlee(勾挂系统服务)技术。这种方法实现起
来比第一种方法简单,但采用了一些非文档化的方法。本文
主要探讨第二种方法。
2系统服务概述
系统服务对于Unix用户来说并不陌生,Unix用户甚至可
以在需要的时候修改它。Windows 20OO也有系统服务,只不
过它被封装在底层,工作在零环,并不直接提供给普通用户使
用。这些系统服务的二进制代码主要存放在ntoakm1.缸e中。
用户态下的程序必须通过wrapper function这个接口来访问
nto6kml中的系统服务。这些wrapper fucfion以动态连接库的
形式提供,主要存放在ntdl1.皿中,也叫本地All(native API),
收稿日期:200 —06—12(修改稿)
个存放相应的服务函数的地址。此外中断处理函数还查询
参数表Ssr'r(System Sel-wio ̄Parameter I Ie)以确定参数是否有
效。该表也包含两个字段,一个存放系统服务II)号,另一个
存放该服务对应的参数个数。图1显示了一个程序调用系统
服务的主要流程。
作者简介:杨荣(1973一),男,浙江江山人,工程师,硕士研究生,主要研究方向:图像处理
6结论
新型的树型控件为Web导航设计带来了很大的方便,结
合.Net的数据库访问技术和XML技术更加增强了控件的功
能。因此在设计中应该把这些技术充分结合从而达到预期的
效果。这里非常重要的是数据库的结构设计,只有设计好数
据库的结构,才能充分存储树的结构信息以便快速生成树。
参考文献
【1】孙三才,许熏伊.精通c#与ASP.NET程序设计【M】.北京:中
国青年出版社,2001.
【2】 东名,吴名月.ASP.NET动态网页设计高手【M】.北京:清华大
学出版社,2001.
【3】王易.ASP.NET网站设计实例通【M】.北京:清华大学出版社,
2 】2.
版权声明:本文标题:树型控件与XML和ADO.NET技术在BS中的应用 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1713585702a642009.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论