CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

请各位大侠赶快帮帮忙!多谢了!!!

楼主sjp7977(sjp)2003-04-04 00:35:19 在 Web 开发 / ASP 提问

我想在页面上实现多个(4-6个)相互关联的下拉式菜单(即选择第一个中的某项,则第二个的选项则变为所选第一个相关联的,选中第二个中的某个后,第三个菜单的选项则变为所选第二个相关联的,依此类推)。  
  而且,下拉菜单的选项必须是从数据库中取出来的(可维护的).  
  不知道怎么实现,请各位大侠尽快帮忙,在下感激不尽!!! 问题点数:0、回复次数:10Top

1 楼youbest(冲天飞豹)回复于 2003-04-04 00:41:53 得分 0

一个简单但不是最好的方法:选择第一下拉菜单后提交将第一个选择提交出去,程序判断并返回与之相关联的第二项下拉菜单,选择第二个下拉菜单则提交前两个选择,程序判断返回第三个下拉菜单的内容,依此类推.  
  明白否?Top

2 楼sjp7977(sjp)回复于 2003-04-04 00:44:27 得分 0

也就是同如下的方式,只是我想用相关联的下拉菜单实现  
   
  {  
         
     
         
  在Sql   server里面建一张表:classify_tbl表结构如下:  
  类别编号 Classify_id Varchar 24  
  类别名称 Classify_name Varchar 50  
   
  为实现递归分类采用如下编码方式:  
                产品类                     001  
                产品类_1                   001001                
                产品类_1_1               001001001  
                产品类_1_2               001001002  
  。。。。  
                产品类2                     002  
                产品类2_1                   002001                
                产品类2_1_1               002001001  
                产品类2_1_2               002001002  
  。。。  
  现求从数据库classify_tbl中取出数据,  
  用多层(理论上可实现无限层)树形菜单显示   效果如下:  
   
  产品类  
              产品类_1    
                              产品类_1_1  
                              产品类_1_2   。。。  
  产品类2  
              产品类2_1    
                              产品类2_1_1  
                              产品类2_1_2   .....  
   
  }  
  Top

3 楼sjp7977(sjp)回复于 2003-04-04 00:45:40 得分 0

我是想在同一个页面中实现Top

4 楼hahu(神仙?妖怪?谢谢!)回复于 2003-04-04 08:49:08 得分 0

两级关联的实现  
  参数主要包括,到数据库的连接,当前返回的上一级,当前级  
  <%function   getclasslist(conn,subjectid,nowselect)  
  if   not   nowselect=""   then  
  if   not   isnumeric(nowselect)   then  
  call   nerror(-4)  
  else   selindex=cint(nowselect)  
  end   if  
  end   if  
   
  result="<option>--==先选择专业==--</option>"  
  if   not   subjectid=""   then  
  if   not   isnumeric(subjectid)   then  
  call   nerror(-4)  
  end   if  
  sql="select   *   from   CLASS   where   DUSER   is   null   and   SID="&subjectid  
  call   crecset(sql,conn,rs4,0,1)  
  if   rs4.eof   then  
  result="<option>没有创建班级</option>"  
  else  
  result=""  
  do   while   not   rs4.eof  
  str=""  
  if   selindex=rs4("ID")   then  
  str="selected"  
  end   if  
  result=result&"<option   value='"&rs4("ID")&"'   "&str&">"&rs4("CNAME")&"</option>"  
  rs4.movenext  
  loop  
  call   srecset(rs4)  
  end   if  
  end   if  
  getclasslist=result  
  end   function  
   
  function   gettermlist(conn,cid)  
  result="<option>无</option>"  
  if   not   cid=""   then  
  if   not   isnumeric(cid)   then  
  call   nerror(-4)  
  end   if  
  sql="select   *   from   CLASS   where   DUSER   is   null   and   ID="&cid  
  call   crecset(sql,conn,rs4,0,1)  
  if   rs4.eof   then  
  result="<option>ERROR</option>"  
  else  
  result=""  
  for   temnum=1   to   8  
  if   not   rs4("term"&cstr(temnum))   then  
  result=result&"<option   value='"&temnum&"'>"&temnum&"</option>"  
  end   if  
  next  
  call   srecset(rs4)  
  end   if  
  end   if  
  gettermlist=result  
  end   function  
  %>  
  <select   name="select"   class="sel"   onChange="javascript:window.location.href='thepage.asp?sid='+  
  this.options[this.selectedIndex].value">  
                                      <%if   request.Form("sid")=""   then%>  
                                      <option   value=""   selected>请先选择专业</option>  
                                      <%end   if%>  
                                      <%=subjectlist(conn2,request.Form("sid"))%>    
                                  </select>  
                                  <br>  
                                  班级:    
                                  <select   name="classid"   class="sel"   >  
                                      <%if   request.Form("sid")=""   then%>  
                                      <option   value=""   selected>请先选择专业</option>  
                                      <%end   if%>  
                                      <%=getclasslist(conn2,request.Form("sid"),"")%>    
                                  </select>Top

5 楼oldsky(九指神丐)回复于 2003-04-04 09:06:54 得分 0

利用RS技术应该可以解决多级联动问题,它它解决了与服务器的远程通信问题,可以保证该页面毫无任何刷新迹象.Top

6 楼sjp7977(sjp)回复于 2003-04-04 10:06:41 得分 0

在下愚昧,请问hahu(dragon),怎么实现多级关联呢?  
              请问oldsky(九指神丐)   什么是RS技术呢,应该怎么实现呢?Top

7 楼sjp7977(sjp)回复于 2003-04-04 10:54:30 得分 0

在线等待,希望得到您的高见!!Top

8 楼oldsky(九指神丐)回复于 2003-04-04 11:23:11 得分 0

RS技术(远程调用脚本):最大的优点是可以在不刷新页面的情况下调用服务端的代码)。正是因为这个特点,你就可以象在编写一个传统的C/S模式的程序一样,对数据库的数据进行处理了。  
  使用RS技术就需要客户端和服务端满足下面两个条件:  
  1。客户端只需要支持Java   applet即可  
  2。而服务端只需要支持ASP即可  
    换句话说,就是RS技术是完全独立与浏览器的(当然浏览器至少需要满足支持Java和JavaScript),你可以在IE中使用,也可以完全在NC中使用,这也是区别与RDS技术的一个显著特点。    
    在能够灵活运用RS技术前,先要说明一个问题,就是前面也曾经提到过的“异步调用”的问题。也正是因为有异步调用,才能够实现你只刷新页面的某一部分而不用刷新整个页面。  
    由于它的这个特点,你可以让服务端来实现在你浏览页面的同时对你输入数据的合法性检查(当然这可以是一系列很复杂的合法性检查,例如需要将用户输入的数据和数据库内已有的数据进行对比等,这个可不是客户端的JS能够解决的),然后当服务端返回检查结果后,你再进行相应的操作(例如弹出一个对话框告诉用户输入出错等等).异步调用时的语法如下:  
   
    RSExecute(serverURL,   functionname,   param_list)  
   
    第一个参数是你想调用的asp页面的完整的URL路径  
   
    第二个参数是你想调用函数的名称  
   
    后面的就是该函数需要的输入参数了  
      
    如果你想调用的函数需要两个输入参数的话,就是这样的写法:  
   
    RSExecute(serverURL,   functionname,   f_arg_1,   f_arg_2)  
   
  当进行调用时有两种写法,  
   
  一种是有返回结果的调用方式:  
   
  objResult   =   RSExecute(serverURL,   functionname,   f_arg_1,   f_arg_2);  
   
  另外一种则是没有返回结果的调用方式:  
   
  RSExecute(url,   func_name,   f_arg_1,   f_arg_2,   CallbackFunction);  
   
    这种调用方式要特别的注意,其中的CallbackFunction是客户端的一个JS函数它表示一但RS执行完毕服务端上的调用,就会马上调用这个函数,并把结果返回到这个函数中去。  
   
  一个典型的CallbackFunction函数应该是这样的结构:     function   CallbackFunction(objResult)   {  
      //你自己的处理过程  
     }    
   
  其中唯一的输入参数objResult就是RS调用的返回值.  
   
    下面我们假设这样一种情况:  
   
    用户在浏览器中输入了用户的e-mail地址,然后用户离开了e-mail地址输入框进入接下来的输入过程,这个时候就是RS该上场了,它根据用户输入的地址在服务端的数据库中查询这个地址,就可以判断出这个用户是否已经存在,然后把结果返回给客户端,在客户端再使用DHTML技术在一个叫"ShowResult"的输入框里面提示用户以前输入的信息。  
   
    function   CallbackFunc(objResult)   {  
        //   提示用户的信息  
        window[objResult.context].value   =   objResult.return_value;  
     }    
    而RSExecute()应该这么调用RSExecute(serverURL,   functionname,   f_arg_1,   CallbackFunc,    
   
  "ShowResult");  
   
  下面还是让具体的代码来发言:  
   
  (请在使用代码前在你的服务器上建立一个叫NW的系统DSN文件,该文件使用了Northworld即中文ACCESS97自带的示例数据库)  
   
    下面的例子是这么进行的,default.htm中分为两祯,在main.html页面中使用了RS技术,大家可以注意到在main.html中没有使用到submit所以如果你在该页面中直接敲回车键的话什么都不会出现,你必须通过鼠标单击那个"获取信息"按扭来使用这个局部页面刷新技术。在单击完该按扭后,页面会有一段小小的延迟(这段时间内java   applet在后台建立了和服务端的连接)然后马上页面回复正常的鼠标,你可以在该页面中继续进行其他的操作。而不必象普通页面刷新时,你只有等待数据。而info.asp大家一眼就能够看明白,其实就是一个很简单的处理字符串的程序。  
   
    如果大家要是对DHTML技术熟悉的话,完全可以在客户端完成这些操作。至于EmpData.asp就是服务端处理数据的程序了。好了,其中的好处大家可以自己去体会。  
   
    特别注意,不要改变太多代码,不然很容易出错,毕竟是在使用JavaScript编程.  
   
  Default.htm文件代码如下:  
  <HTML>  
  <HEAD>  
  <TITLE>RS技术的实现例子</TITLE>  
  </HEAD>  
  <FRAMESET   id=fset   rows="70%,30%">  
  <FRAME   name=main   src="main.html">    
  <FRAME   name=info   src="info.asp">    
  </FRAMESET>  
  </HTML>  
   
  Maim.html文件代码如下  
  <HTML>  
  <HEAD>  
  <TITLE>RS技术的实现例子</TITLE>  
  </HEAD>  
  <BODY>  
  <script   language="JavaScript"   src="http://YourServer/_ScriptLibrary/rs.htm"></script>  
  <script   language="JavaScript">  
  RSEnableRemoteScripting("http://YourServer/_ScriptLibrary");  
  </script>  
  <h1>雇员信息</h1>  
  <hr>  
  <form   name=MyForm>  
  请输入你想查询的名字:  
  <br><input   type=text   name="empLastName"   size=40>    
  <input   type=button   name=btnExecute   style="width=150"  
  value="获取信息"    
  onclick="execAsynch(empLastName.value)">  
  </form>  
  <hr>  
   
  <SCRIPT   LANGUAGE="javascript">  
  var   serverURL   =   "http://YourServer";  
  var   pageURL   =   "/batman/EmpData.asp";  
  function   refreshPage(co)  
  {  
  if   (co.status   !=   0)   {  
  alert("发生异常错误\n"   +    
  message);  
  }  
  strText   =   co.return_value;    
  top.info.location   =   "info.asp?info="   +   escape(strText);  
  }  
  function   execAsynch(empLastName)  
  {  
  RSExecute(serverURL+pageURL,   "GetEmpInfoAsArray",    
  empLastName,   refreshPage);  
  }  
  </SCRIPT>  
  </BODY>  
  </HTML>  
   
  info.asp文件代码  
  <HTML>  
  <BODY>  
  <%  
  Response.Write   Request.ServerVariables("REMOTE_USER")    
  strText   =   Request.QueryString("info")  
  If   strText   =   ""   Then   Response.End  
  arrData   =   split(strText,   "|")  
  arrLabels   =   split("职工,头衔,城市,雇佣日期",   ",")  
  %>  
  <table   border=0>  
  <%    
  for   i=0   to   3  
  Response.Write   "<tr>"  
  Response.Write   "<td><b>"   &   arrLabels(i)   &   "</b></td>"    
  Response.Write   "<td><i>"   &   arrData(i)   &   "</i></td>"    
  next  
  %>  
  </table>  
  </BODY>  
  </HTML>  
   
  EmpData.asp文件  
  <%@   LANGUAGE=VBSCRIPT   %>  
  <%   RSDispatch   %>  
   
  <SCRIPT   RUNAT=SERVER   Language=javascript>  
  <!--#INCLUDE   VIRTUAL="/_ScriptLibrary/RS.ASP"-->  
   
  function   Description()  
  {    
  this.GetEmpInfoAsArray   =   DoGetData;  
  }  
  public_description   =   new   Description();  
   
  function   DoGetData(empName)  
  {  
  sql   =   "select   *   from   雇员   where   [名字]='"   +   empName   +   "'";  
  rst   =   new   ActiveXObject("ADODB.Recordset");  
  rst.CursorLocation   =   3;    
  rst.Open(sql,   "NW");  
  i   =   0;  
       strText   =   "";  
  if   (rst.RecordCount   ==   1)   {  
  strText   +=   rst.Fields("雇员ID").Value   +   "   -   "   +  
  rst.Fields("尊称").Value   +   "   "   +    
  rst.Fields("姓氏").Value   +   "   "   +    
  rst.Fields("名字").Value;  
  strText   +=   "|";  
  strText   +=   rst.Fields("头衔").Value;  
  strText   +=   "|";  
  strText   +=   rst.Fields("城市").Value   +   "   "   +    
  rst.Fields("地区").Value   +   ",   "   +  
  rst.Fields("国家").Value;  
  strText   +=   "|";  
  d   =   new   Date(rst.Fields("雇用日期").Value);  
  strText   +=   (1+d.getMonth())   +   "/"   +   d.getDate()   +   "/"   +d.getYear();  
  }  
  return   strText;  
  }  
  </SCRIPT>    
   
   
     
  Top

9 楼sjp7977(sjp)回复于 2003-04-05 12:31:25 得分 0

多谢!!!Top

10 楼sjp7977(sjp)回复于 2003-04-13 22:59:34 得分 0

有没有那位大侠能提供现成的代码?Top

相关问题

  • 请教各位大侠,急,多谢了!
  • 请问各位大侠,急,多谢了!
  • 请教各位GGJJ一个简单的SELECT问题,多谢多谢
  • 请帮忙,多谢,多谢!
  • 急!请大家帮帮忙!多多谢各位!
  • 请问各位大侠 如何打印MsChart(饼图) 多谢!!!
  • 请问各位:如何编译Java的程序。多谢!
  • 邮件莫名消失,请求各位相助。多谢了!
  • 各位大虾,请教一下,vc++中dll的问题,多谢!!!
  • 急急!!请各位大哥帮个忙,多谢了!

关键词

得分解答快速导航

  • 帖主:sjp7977

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo