当前位置: 移动技术网 > IT编程>开发语言>.net > 适用与firefox ASP.NET无刷新二级联动下拉列表

适用与firefox ASP.NET无刷新二级联动下拉列表

2018年04月25日  | 移动技术网IT编程  | 我要评论

牛娃闯都市,鸡胸图片,江苏高速公路路况

可能"极好的"又会带来很多的非议,但是我认为这确实很好,我看了大约20个无刷新的连动下拉列表,他们在firefox下面就一团糟.为了这个我差不多搞了两天,就是如果提交窗体后如何保持第二个列表框的值,因为通过js 给下拉框添加条目那么他的状态是不会被保存的测试平台:ie6,firefox 

功能:二级无刷新连动 

特点:跨浏览器;提交窗体取第二下拉框的值;数据来源于数据库;以xmlhttp来发送请求,实现无刷新 

请求:如果您能够找到更好的方法请告诉我,非常感谢,您的批评和建议对我是莫大的鼓励 

webform1.aspx: 


<%@ page language="c#" codebehind="webform1.aspx.cs" autoeventwireup="false" inherits="drop.webform1" %> 
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" > 
<html> 
<head> 
<title>webform1</title> 
<meta name="generator" content="microsoft visual studio .net 7.1"> 
<meta name="code_language" content="c#"> 
<meta name="vs_defaultclientscript" content="javascript"> 
<meta name="vs_targetschema" content="http://schemas.microsoft.com/intellisense/ie5"> 
<script language="javascript"> 
//jb函数会根据不同的浏览器初始化个xmlhttp对象 
function jb() 

var a=null; 
try 

a=new activexobject("msxml2.xmlhttp"); 

catch(e) 

try 

a=new activexobject("microsoft.xmlhttp"); 

catch(oc) 

a=null 


if ( !a && typeof xmlhttprequest != "undefined" ) 

a=new xmlhttprequest() 

return a 


//下面go函数是父列表框改变的时候调用,参数是选择的条目 
function go(obj) 

//得到选择框的下拉列表的value 
var svalue = obj.value; 
//定义要处理数据的页面 
var weburl = "webform1.aspx?parent_id="+svalue; 
//初始化个xmlhttp对象 
var xmlhttp = jb(); 
//提交数据,第一个参数最好为get,第三个参数最好为true 
xmlhttp.open("get",weburl,true); 
// alert(xmlhttp.responsetext); 
//如果已经成功的返回了数据 
xmlhttp.onreadystatechange=function() 

if(xmlhttp.readystate==4)//4代表成功返回数据 

var result = xmlhttp.responsetext;//得到服务器返回的数据 
//先清空dlistchild的所有下拉项 
document.getelementbyid("dlistchild").length = 0; 
//给dlistchild加个全部型号的,注意是option不是option 
document.getelementbyid("dlistchild").options.add(new option("全部型号","0")); 
if(result!="")//如果返回的数据不是空 

//把收到的字符串按照,分割成数组 
var allarray = result.split(","); 
//循环这个数组,注意是从1开始,因为收到的字符串第一个字符是,号,所以分割后第一个数组为空 
for(var i=1;i<allarray.length;i++) 

//在把这个字符串按照|分割成数组 
var thisarray = allarray[i].split("|"); 
//为dlistchild添加条目 
document.getelementbyid("dlistchild").options.add(new option(thisarray[1].tostring(),thisarray[0].tostring())); 




//发送数据,请注意顺序和参数,参数一定为null或者"" 
xmlhttp.send(null); 

</script> 
</head> 
<body ms_positioning="gridlayout"> 
<form id="form1" method="post" runat="server"> 
<asp:dropdownlist onchange="go(this)" id="dlistparent" style="z-index: 101; left: 248px; position: absolute; top: 40px" 
runat="server"> 
<asp:listitem value="100">摩托罗拉</asp:listitem> 
<asp:listitem value="101">诺基亚</asp:listitem> 
</asp:dropdownlist> 
<asp:dropdownlist id="dlistchild" style="z-index: 102; left: 248px; position: absolute; top: 104px" 
runat="server"></asp:dropdownlist> 
<asp:button id="button1" style="z-index: 103; left: 256px; position: absolute; top: 176px" runat="server" 
text="button"></asp:button> 
</form> 
</body> 
</html> 

后台webform1.aspx.cs: 
using system; 
using system.collections; 
using system.componentmodel; 
using system.data; 
using system.drawing; 
using system.web; 
using system.web.sessionstate; 
using system.web.ui; 
using system.web.ui.webcontrols; 
using system.web.ui.htmlcontrols; 
using system.configuration; 
using system.data.sqlclient; 

namespace drop 

/// <summary> 
/// webform1 的摘要说明。 
/// </summary> 
public class webform1 : system.web.ui.page 

protected system.web.ui.webcontrols.dropdownlist dlistparent; 
protected system.web.ui.webcontrols.button button1; 
protected system.web.ui.webcontrols.dropdownlist dlistchild; 

private void page_load(object sender, system.eventargs e) 

// 在此处放置用户代码以初始化页面 
//if(!ispostback) 
//{ 
binddrop();//如果不是提交回来就绑定列表框 
//} 


protected void binddrop() 

//首先我想父dropdownlist也绑定数据库,后面想没必要 
//if(!ispostback) 
//{ 
//绑定父dlistparent 
// bindparent(); 
//} 
//获得传递过来的parent_id值,如果是第一次请求他为null 
string str = request.querystring["parent_id"]; 
string str1 = dlistparent.selectedvalue;; 
response.write(str1); 
//如果str加个字符串!=原来的字符串则说明触发过dlistparent的onchange事件 
if((str+"abc")!="abc") 

//绑定 dlistchild控件 
bindchild(str);//把传来的父dropdownlist的value做为参数 

else 
bindparent(str1); 



protected void bindparent(string str) 

//如果是第一次请求或者是刷新这个页面则根据dlistparent的值来选择 
//把参数转化成int 
int i = convert.toint32(str); 
dlistchild.items.clear(); 
dlistchild.items.add(new listitem("全部型号","0")); 
//得到数据库连接字符串 
string connstr = configurationsettings.appsettings["connstring"].tostring(); 
//初始化个conn对象 
sqlconnection conn = new sqlconnection(connstr); 
//数据库语句 
string commstr = string.format("select type_value,type_text from phone_type where parent_id={0}",i); 
//建立数据库命令对象 
sqlcommand comm = new sqlcommand(commstr,conn); 
//打开数据库 
conn.open(); 
//执行命令 
sqldatareader dr = comm.executereader(); 
//循环dr,给dlistparent添加条目 
while(dr.read()) 

dlistchild.items.add(new listitem(dr[1].tostring(),dr[0].tostring())); 
//也可以这样 
//dlistparent.items.add(new listitem(dr["phone_text"].tostring(),dr["phone_value"].tostring())); 

dlistparent.items[0].selected = true; 
//添加下面这话的意思是当点提交按钮提交窗体的时候第二个dlistchild的状态能够得到保存 
dlistchild.selectedvalue = request.form["dlistchild"]; 
dr.close(); 
conn.close(); 



protected void bindchild(string str) 

//通过js给包括dropdownlist任何控件添加的内容不会被保存状态 
//把参数转化成int 
int i = convert.toint32(str); 
//定义个字符串用保存从数据库返回的数据 
string result = ""; 
//先清空输出的东西 
response.clear(); 
string connstr = configurationsettings.appsettings["connstring"].tostring(); 
sqlconnection conn = new sqlconnection(connstr); 
sqlcommand comm = conn.createcommand(); 
string commstr = string.format("select type_value,type_text from phone_type where parent_id = {0}",i); 
comm.commandtext = commstr; 
conn.open(); 
sqldatareader dr = comm.executereader(); 
while(dr.read()) 

result += ","+dr[0].tostring() +"|" + dr[1].tostring(); 
//dlistchild.items.add(new listitem(dr[1].tostring(),dr[0].tostring())); 

//把从数据库得到的信息输出到客户端 
response.write(result); 
//输出完成关闭response,以免造成不必要的输出 
response.flush(); 
response.close(); 
dr.close(); 
conn.close(); 

#region web 窗体设计器生成的代码 
override protected void oninit(eventargs e) 

// 
// codegen: 该调用是 asp.net web 窗体设计器所必需的。 
// 
initializecomponent(); 
base.oninit(e); 


/// <summary> 
/// 设计器支持所需的方法 - 不要使用代码编辑器修改 
/// 此方法的内容。 
/// </summary> 
private void initializecomponent() 

this.button1.click += new system.eventhandler(this.button1_click); 
this.load += new system.eventhandler(this.page_load); 


#endregion 

private void button1_click(object sender, system.eventargs e) 

response.write(request.form["dlistchild"].tostring()); 



如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网