<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width: 414pt; height: 165.75pt;"><v:imagedata src="file:///C:\DOCUME~1\XUXIAN~1\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg" o:title="search"></v:imagedata></v:shape>
从数据查询速度和程序易用性角度考虑,本页面载入时应该有尽量少的数据量,而且要能在一个查询页面中完成查询条件的选 择。简单地说,就是要实现在同一个客户端页面中,在前两个下拉列表中选择了相应的学校名称和系部名称后,在第三个下拉列表(班级)中只有符合前两项条件的 若干个记录以供客户选择。但是在不刷新本页面的情况下,由于在客户端必须通过Submit才能和服务器端取得联系并获得数据,所以很难实现。 可行的方法至少有如下三种: 1、利用数组来实现 在页面载入时将全部数据(如班级名称)通过记录集全部放到相应的数组ArrClass中。当用户选择了相应的学校或系部 后,将其值放到相应变量College或Department中,同时通过前两个下拉列表框的onChange事件调用客户端函数 SelectClass。这个函数的功能就是根据变量的值在数组中依次查找到符合条件的数组元素,将其作为下拉列表ListClass的Option项。 通过这个方法,可以在不刷新页面、不重复传递大量数据的情况下实现客户端动态数据更新。但是,其缺点是显然的,那就是当打开页面时用户得有足够的耐心去忍 受通过缓慢的网络从服务器获得大量查询数据(如有上百条以上记录)。 2、利用asp.net来实现 微软已经推出了其asp.net技术,通过其能很方便的实现这个功能。但是asp.net的运行解释基础不再是asp.dll,而是.net平台(测试版),111M的asp.net平台相信还不是客户的首选。 3、通过ASP和XML来实现 通过ASP和XML组件的结合,可以很方便的实现这个功能。特点就是页面不用刷新,数据传输实时动态,数据量少,不用把大量的数据传到客户端,速度相对较快。 下面就通过实例介绍实现客户端多表单域动态数据更新的第三种方法。 开发环境如下,经调试成功通过:WWW服务器<o:p> </o:p>
windows 2000 server(IIS 5)<o:p> </o:p>
数据库<o:p> </o:p>
SQL Server 7.0<o:p> </o:p>
浏览器<o:p> </o:p>
Internet Explore 5.5<o:p> </o:p>
数据库名称<o:p> </o:p>
gzz_back<o:p> </o:p>
<o:p> </o:p>
数据库结构<o:p> </o:p>
table名称<o:p> </o:p>
字段1<o:p> </o:p>
字段2<o:p> </o:p>
字段3<o:p> </o:p>
字段4<o:p> </o:p>
pcollege<o:p> </o:p>
college_name<o:p> </o:p>
college_code<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
pdepartment<o:p> </o:p>
department_name<o:p> </o:p>
department_code<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
pspecialty <o:p></o:p>
specialty_name<o:p> </o:p>
specialty_code<o:p> </o:p>
college_code<o:p> </o:p>
department_code<o:p> </o:p>
pclass<o:p> </o:p>
specialty_code<o:p> </o:p>
class_name<o:p> </o:p>
class_code <o:p></o:p>
<o:p> </o:p>
文件1:index.asp(主页面) <!-- index.asp --> <%@ LANGUAGE="VBSCRIPT"%> <!--#include file="adovbs.inc" --> <% strPathInfo=Request.ServerVariables("PATH_INFO") strPathInfo="http://"&Request.ServerVariables("SERVER_NAME")& left(strPathInfo,InstrRev(strPathInfo,"/")) set conn=Server.CreateObject("ADODB.connection") conn.open"driver={SQL Server};server=JYZD-WMG;uid=sa;pwd=; database=gzz_back;" %> <% set Rscollege= Server.CreateObject("ADODB.Recordset") Rscollege.Source ="SELECT DISTINCT college_name FROM dbo.pcollege" Rscollege.activeconnection=conn Rscollege.CursorType = 0 Rscollege.CursorLocation = 2 Rscollege.LockType = 3 Rscollege.Open() arrcollege=rscollege.GetRows() Rscollege.numRows = 0 %> <% set Recordset3 = Server.CreateObject("ADODB.Recordset") Rsdepartment.Source ="SELECT department_name FROM dbo.pdepartment" Rsdepartment.activeconnection=conn Rsdepartment.CursorType = 0 Rsdepartment.CursorLocation = 2 Rsdepartment.LockType = 3 Rsdepartment.Open() arrdepartment=Rsdepartment.GetRows() Rsdepartment.numRows = 0 %> <% Rscollege.Close() Rsdepartment.Close() conn.close() set Rscollege=nothing set Rsdepartment=nothing %> <script language="vbscript"> <!-- sub beginyear_onclick() classfrm.endyear.value=classfrm.beginyear.value+1 end sub --> </script> <html> <head> <title>用ASP和XML实现多表单域数据动态更新示例</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <script language="javascript"> <!-- function SelectClass() { //清空班级表单 for(var i=classfrm.listclass.options.length-1;i>=0;--i) { classfrm.Listclass.options.remove(i); } var collegename=classfrm.listschool.options(classfrm.listschool.selectedIndex).value; var departname=classfrm.listdepart.options(classfrm.listdepart.selectedIndex).value; var oXMLDoc=new ActiveXObject('MSXML'); sURL='<%=strPathInfo%>XMLclass.asp?college='+collegename+'& depart='+departname; oXMLDoc.url=sURL; var oRoot=oXMLDoc.root; if(oRoot.children!=null) { for(var i=0;i<oRoot.children.length;++i) { oItem=oRoot.children.item(i); sName=oItem.text; var oOption=document.createElement('OPTION'); oOption.text=sName; oOption.value=sName; classfrm.listclass.options.add(oOption); } } } --> </script> </head> <body text="#000000" bgcolor="#FFFFD7"> <div align="center"> <table width="80%" border="1" bordercolordark=darkgray bordercolorlight=aliceblue height="210" align="center" > <tr> <td colspan="2" height="4"> <div align="center"> <font size="5"><b>综合示例</b></font></div> </td> </tr> <tr> <td width="145" height="186"> <div align="center"><font color="#000000">请选择 </font></div> <p align="center"><font color="#000000">学年/学期/班级</font></p> </td> <td width="443" height="186" > <form name="classfrm" method="post" action="SearchPlan.asp"> <div align="center"> <%dim sumyear %> <%sumyear=year(date)+1%> <select name="classbeginyear" size="1" > <option value="<%=sumyear%>" ><%=sumyear%></option> <%sumyear=sumyear-1%> <option value="<%=sumyear%>" selected><%=sumyear%></option> <%for i=1 to 18 %> <%sumyear=sumyear-1%> <option value="<%=sumyear%>" ><%=sumyear%></option> <%next%> </select> 至 <%sumyear=year(date)%> <input name="classendyear" value="<%=sumyear+1%>" readonly > 年度 <select name="classterm" size="1"> <option value="1" selected>第一</option> <option value="2">第二</option> </select> 学期<br> <br> <select name="classschool" id="classschool" οnchange="chooseclass()"> <%for i=lbound(arrpr1,2) to ubound(arrpr1,2)%> <option value="<%=arrpr1(0,i)%>"><%=arrpr1(0,i)%></option> <%next%> </select> 学校 <select name="classdepart" id="classdepart" οnchange="chooseclass()"> <%for i=lbound(arrpr3,2) to ubound(arrpr3,2)%> <option value="<%=arrpr3(0,i)%>"><%=arrpr3(0,i)%></option> <%next%> </select> 系部<br> <br> <select name="classname" id="classname"> </select> <script language="vbscript"> <!-- call chooseclass() --> </script> 班级</div> <p align="center"> <input type="submit" name="Submit1" value="确定发送" onClick="searchclass"> <input type="reset" name="reset1" value="重填"> </p> </form> </td> </tr> </table> </div> </body> </html> 文件2:xmlclass.asp(动态数据查询,由主页面获得查询值) <!-- xmlclass.asp --> <%@ LANGUAGE="VBSCRIPT" %> <% collegename=trim(Request.QueryString("college")) departmentname=trim(Request.QueryString("depart")) set conn=Server.CreateObject("ADODB.connection") conn.open "driver={SQL Server};server=JYZD-WMG;uid=sa;pwd=; database=gzz_back;" changstr="select class_name from pclass where specialty_code in ( select specialty_code from pspecialty where college_code in ( select college_code from pcollege where college_name='"&collegename&"') and department_code in ( select department_code from pdepartment where department_name ='"&departmentname&"')) " set Rsclass = Server.CreateObject("ADODB.Recordset") Rsclass.Source =changstr Rsclass.activeconnection=conn Rsclass.CursorType = 0 Rsclass.CursorLocation = 2 Rsclass.LockType = 3 Rsclass.Open() arrclass=recordset2.GetRows() Rsclass.numRows = 0 %> <? xml version="1.0" encoding="gb2312" ?> <classes> <%For i =LBound(arrclass,2) To UBound(arrclass,2)%> <class> <%=arrclass(0,i)%> </class> <%Next%> </classes> 在index.asp中,当在listcollege或listdepart两个下拉列表中选择了相应的学校和系部后, 触发selectclass函数,在此函数中通过ASP文件传值方式(如xmlclass?college=江阴高等技术学院&depart=电 子工程系)向xmlclass.asp传递查询条件,然后由Rsclass记录集从服务器端获得符合条件的班级记录,并通过数组返送到客户端 listclass下拉列表。通过这种方式,从而在不刷新页面、只传递少量数据的情况下实现了客户端多表单域的数据动态更新。