三级地区无刷新实现菜单联动
2007-05-11 15:42
591 查看
仿照http://www.cnblogs.com/asboy/archive/2007/05/05/ajaxpro.html做了个类似的功能,发觉ajax的功能的确满有趣的,不过这段代码还存在一个问题是不能省只能改变市,而后面的地区不会跟着变化,还有待改进。
先在web.config中添加<system.web>
<!--for Ajaxnet-->
<httpHandlers>
<add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2"/>
</httpHandlers>
<!--其他设置-->
</system.web>
然后去ajax中国下一个ajax.2.dll当时找到了两个,我后来只用了这个,另一个有待看过blog的人去试验,这里关键是要把自己的class文件把在aspx前的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="regFillIn.aspx.cs" Inherits="_Default" %>
而这里_Default是注册的类,看了很多这样的资料才发觉这样一个问题,否则会跟踪进去.
里面代码如下,我把从sql语句生成Dataset做成了commontools里的一个方法,方便重用.
/**//// <summary>
/// 数据绑定
/// </summary>
private void BindDc()
...{
CommonTools.FuncDB FuncDB = new CommonTools.FuncDB();
CommonTools.Common.sCon = "server=.;User ID=sa;Password=wanglin;database=OnlineSuscribeSystem;Connection Reset=FALSE";
//第一个Ddl
string sql = @"select * from Area where parentid=0";
DdlProvince.DataSource = FuncDB.getDataSet(sql);
DdlProvince.DataTextField = "CityName";
DdlProvince.DataValueField = "Id";
DdlProvince.DataBind();
if (DdlProvince.DataSource != null) DdlProvince.Attributes.Add("onchange", "showNext(this.options[selectedIndex].value,'DdlCity')");
//第二个Ddl
if (DdlProvince.SelectedItem != null)
...{
sql = @"select * from Area where Parentid=" + DdlProvince.SelectedItem.Value;
DdlCity.DataSource = FuncDB.getDataSet(sql);
DdlCity.DataTextField = "CityName";
DdlCity.DataValueField = "Id";
DdlCity.DataBind();
}
//第三个
if (DdlCity.SelectedItem != null)
...{
if (DdlCity.DataSource != null) DdlCity.Attributes.Add("onchange", "showNext(this.options[selectedIndex].value,'DdlArea')");
sql = @"select * from Area where parentid=" + DdlCity.SelectedItem.Value;
DdlArea.DataSource = FuncDB.getDataSet(sql);
DdlArea.DataTextField = "CityName";
DdlArea.DataValueField = "id";
DdlArea.DataBind();
}
}
[AjaxPro.AjaxMethod]
public DataSet getNextClass(string cid)
...{
CommonTools.FuncDB FuncDB = new CommonTools.FuncDB();
CommonTools.Common.sCon = "server=.;User ID=sa;Password=wanglin;database=OnlineSuscribeSystem;Connection Reset=FALSE";
string sql = @"select CityName as txt,Id as vol from Area where Parentid=" + cid;
try
...{
return FuncDB.getDataSet(sql);
}
catch
...{
return null;
}
}
其中的FuncDB.getDataset(sql) 放在另一个文件,类文件如下:
public class FuncDB
...{
SqlConnection cn;
定义数据库操作不带参数的函数#region 定义数据库操作不带参数的函数
/**//// <summary>
/// 打开数据库连接.
/// </summary>
private void Open()
...{
// 打开数据库连接
if (cn == null) cn = new SqlConnection(CommonTools.Common.sCon);
if (cn.State == System.Data.ConnectionState.Closed) cn.Open();
}
/**//// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
...{
if (cn != null) cn.Close();
}
/**//// <summary>
/// 释放资源
/// </summary>
public void Dispose()
...{
// 确认连接是否已经关闭
if (cn != null)
...{
cn.Dispose();
cn = null;
}
}
#endregion
定义数据库操作带参数的函数#region 定义数据库操作带参数的函数
/**//// <summary>
/// 定义数据库操作带参数的函数
/// </summary>
/// <param name="cn"></param>
public void Open(SqlConnection cn)
...{
if (cn == null || cn.State == System.Data.ConnectionState.Closed)
...{
cn.Open();
}
}
public void Dispose(SqlConnection cn)
...{
if (cn != null)
...{
if (cn.State == System.Data.ConnectionState.Open) ...{ cn.Close(); }
cn.Dispose();
cn = null;
}
}
public void Close(SqlConnection cn)
...{
if (cn != null)
...{
if(cn.State==System.Data.ConnectionState.Open)...{cn.Close();}
}
}
#endregion
public System.Boolean executeQuery(string sqlString,SqlConnection cn)
...{
try
...{
cn.Open();
System.Data.SqlClient.SqlCommand myCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myCommand.ExecuteNonQuery();
cn.Close();
return true;
}
catch(SqlException ex)
...{
cn.Close();
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
return false;
}
}
public string sqlEncode(string sqlItem)
...{
return System.Text.RegularExpressions.Regex.Replace(sqlItem,"'","''");
}
public bool getData(System.Data.DataSet ResultSet,string sourcetable,string sqlString,SqlConnection cn)
...{
try
...{
System.Data.SqlClient.SqlDataAdapter myAdapter=new System.Data.SqlClient.SqlDataAdapter();
myAdapter.SelectCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myAdapter.Fill(ResultSet,sourcetable);
myAdapter.Dispose();
return true;
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
return false;
}
}
public bool getData(System.Data.DataSet ResultSet,string sourcetable,string sqlString,int StartIndex,int MaxRecord,SqlConnection cn)
...{
try
...{
System.Data.SqlClient.SqlDataAdapter myAdapter=new System.Data.SqlClient.SqlDataAdapter();
myAdapter.SelectCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myAdapter.Fill(ResultSet,StartIndex,MaxRecord,sourcetable);
myAdapter.Dispose();
return true;
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
return false;
}
}
public bool getData(string sqlString,SqlConnection cn,out SqlDataReader dataReader)
...{
try
...{
cn.Open();
System.Data.SqlClient.SqlCommand myCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myCommand.CommandText=sqlString;
dataReader=myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
myCommand.Dispose();
return true;
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
dataReader=null;
return false;
}
}
public SqlDataReader getDataReader(string sqlString,SqlConnection cn)
...{
SqlDataReader dataReader=null;
try
...{
cn.Open();
System.Data.SqlClient.SqlCommand myCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myCommand.CommandText=sqlString;
dataReader=myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
myCommand.Dispose();
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
dataReader=null;
}
return dataReader;
}
public DataSet getDataSet(string sqlString)
...{
DataSet Ds = new DataSet();
try
...{
Open();
SqlDataAdapter Da = new SqlDataAdapter(sqlString, cn);
Da.Fill(Ds);
Da.Dispose();
}
catch (SqlException ex)
...{
LogManager.WriteError(ex.Message + " " + ex.StackTrace);
Ds = null;
}
Close();
return Ds;
}
/**//// <summary>
/// 通过SQL语句获得DataSet
/// </summary>
/// <param name="sqlString">SQL语句</param>
/// <param name="cn">连接字符串名字</param>
/// <returns></returns>
public DataSet getDataSet(string sqlString, SqlConnection cn)
...{
DataSet Ds=new DataSet();
try
...{
cn.Open();
SqlDataAdapter Da = new SqlDataAdapter(sqlString, cn);
Da.Fill(Ds);
Da.Dispose();
}
catch (SqlException ex)
...{
LogManager.WriteError(ex.Message + " " + ex.StackTrace);
Ds = null;
}
return Ds;
}
public int GetRecordCount(string sqlString,SqlConnection cn)
...{
int m=0;
SqlDataReader dr=null;
if(getData("select count(*) as co from "+sqlString,cn,out dr))
...{
if(dr.Read())
...{
m=int.Parse(dr["co"].ToString());
}
dr.Close();
}
this.Close(cn);
return m;
}
public bool CheckRecord(string sqlString,SqlConnection cn)
...{
bool b=false;
SqlDataReader dr=null;
if(getData(sqlString,cn,out dr))
...{
if(dr.Read())
...{
b=true;
}
dr.Close();
}
this.Close(cn);
return b;
}
}
贴了些多余的,只要找到getDataSet()就行,然后最后在<Head></Head>里面加入javascript代码
<script type="text/javascript">
<!--
function getBid(s)...{
return document.getElementById(s);
}
function getBmc(s)...{
return document.getElementsByName(s);
}
//显示分类列表
function showNext(sid,obj)
...{
alert(sid);
if(sid==null||sid==""||sid.length<1)return;
var slt=getBid(obj);
var v=_Default.getNextClass(sid).value;
if(v!=null)
...{
;
if(v!=null&&typeof(v)=="object"&&v.Tables!=null)
...{
slt.length=0;
slt.options.add(new Option("请选择",0));
//加一个"请选择主要为了触发onchange 事件
if(obj=="DdlCity")
...{
getBid("DdlArea").options.length=0;
getBid("DdlArea").options.add(new Option("请选择",0));
}
alert(v.Tables[0].Rows.length);
for(var i=0;i<v.Tables[0].Rows.length;i++)
...{
var txt=v.Tables[0].Rows[i].txt;//这个地方要注意区分大小写
var vol=v.Tables[0].Rows[i].vol;//和dataset表的列名称要一致
slt.options.add(new Option(txt,vol));
}
}
}
return;
}
-->
</script>
作者已经写的非常经典,非常感谢,我只是做了些重用的改动,记下来方便以后学习使用。
先在web.config中添加<system.web>
<!--for Ajaxnet-->
<httpHandlers>
<add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2"/>
</httpHandlers>
<!--其他设置-->
</system.web>
然后去ajax中国下一个ajax.2.dll当时找到了两个,我后来只用了这个,另一个有待看过blog的人去试验,这里关键是要把自己的class文件把在aspx前的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="regFillIn.aspx.cs" Inherits="_Default" %>
而这里_Default是注册的类,看了很多这样的资料才发觉这样一个问题,否则会跟踪进去.
里面代码如下,我把从sql语句生成Dataset做成了commontools里的一个方法,方便重用.
/**//// <summary>
/// 数据绑定
/// </summary>
private void BindDc()
...{
CommonTools.FuncDB FuncDB = new CommonTools.FuncDB();
CommonTools.Common.sCon = "server=.;User ID=sa;Password=wanglin;database=OnlineSuscribeSystem;Connection Reset=FALSE";
//第一个Ddl
string sql = @"select * from Area where parentid=0";
DdlProvince.DataSource = FuncDB.getDataSet(sql);
DdlProvince.DataTextField = "CityName";
DdlProvince.DataValueField = "Id";
DdlProvince.DataBind();
if (DdlProvince.DataSource != null) DdlProvince.Attributes.Add("onchange", "showNext(this.options[selectedIndex].value,'DdlCity')");
//第二个Ddl
if (DdlProvince.SelectedItem != null)
...{
sql = @"select * from Area where Parentid=" + DdlProvince.SelectedItem.Value;
DdlCity.DataSource = FuncDB.getDataSet(sql);
DdlCity.DataTextField = "CityName";
DdlCity.DataValueField = "Id";
DdlCity.DataBind();
}
//第三个
if (DdlCity.SelectedItem != null)
...{
if (DdlCity.DataSource != null) DdlCity.Attributes.Add("onchange", "showNext(this.options[selectedIndex].value,'DdlArea')");
sql = @"select * from Area where parentid=" + DdlCity.SelectedItem.Value;
DdlArea.DataSource = FuncDB.getDataSet(sql);
DdlArea.DataTextField = "CityName";
DdlArea.DataValueField = "id";
DdlArea.DataBind();
}
}
[AjaxPro.AjaxMethod]
public DataSet getNextClass(string cid)
...{
CommonTools.FuncDB FuncDB = new CommonTools.FuncDB();
CommonTools.Common.sCon = "server=.;User ID=sa;Password=wanglin;database=OnlineSuscribeSystem;Connection Reset=FALSE";
string sql = @"select CityName as txt,Id as vol from Area where Parentid=" + cid;
try
...{
return FuncDB.getDataSet(sql);
}
catch
...{
return null;
}
}
其中的FuncDB.getDataset(sql) 放在另一个文件,类文件如下:
public class FuncDB
...{
SqlConnection cn;
定义数据库操作不带参数的函数#region 定义数据库操作不带参数的函数
/**//// <summary>
/// 打开数据库连接.
/// </summary>
private void Open()
...{
// 打开数据库连接
if (cn == null) cn = new SqlConnection(CommonTools.Common.sCon);
if (cn.State == System.Data.ConnectionState.Closed) cn.Open();
}
/**//// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
...{
if (cn != null) cn.Close();
}
/**//// <summary>
/// 释放资源
/// </summary>
public void Dispose()
...{
// 确认连接是否已经关闭
if (cn != null)
...{
cn.Dispose();
cn = null;
}
}
#endregion
定义数据库操作带参数的函数#region 定义数据库操作带参数的函数
/**//// <summary>
/// 定义数据库操作带参数的函数
/// </summary>
/// <param name="cn"></param>
public void Open(SqlConnection cn)
...{
if (cn == null || cn.State == System.Data.ConnectionState.Closed)
...{
cn.Open();
}
}
public void Dispose(SqlConnection cn)
...{
if (cn != null)
...{
if (cn.State == System.Data.ConnectionState.Open) ...{ cn.Close(); }
cn.Dispose();
cn = null;
}
}
public void Close(SqlConnection cn)
...{
if (cn != null)
...{
if(cn.State==System.Data.ConnectionState.Open)...{cn.Close();}
}
}
#endregion
public System.Boolean executeQuery(string sqlString,SqlConnection cn)
...{
try
...{
cn.Open();
System.Data.SqlClient.SqlCommand myCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myCommand.ExecuteNonQuery();
cn.Close();
return true;
}
catch(SqlException ex)
...{
cn.Close();
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
return false;
}
}
public string sqlEncode(string sqlItem)
...{
return System.Text.RegularExpressions.Regex.Replace(sqlItem,"'","''");
}
public bool getData(System.Data.DataSet ResultSet,string sourcetable,string sqlString,SqlConnection cn)
...{
try
...{
System.Data.SqlClient.SqlDataAdapter myAdapter=new System.Data.SqlClient.SqlDataAdapter();
myAdapter.SelectCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myAdapter.Fill(ResultSet,sourcetable);
myAdapter.Dispose();
return true;
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
return false;
}
}
public bool getData(System.Data.DataSet ResultSet,string sourcetable,string sqlString,int StartIndex,int MaxRecord,SqlConnection cn)
...{
try
...{
System.Data.SqlClient.SqlDataAdapter myAdapter=new System.Data.SqlClient.SqlDataAdapter();
myAdapter.SelectCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myAdapter.Fill(ResultSet,StartIndex,MaxRecord,sourcetable);
myAdapter.Dispose();
return true;
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
return false;
}
}
public bool getData(string sqlString,SqlConnection cn,out SqlDataReader dataReader)
...{
try
...{
cn.Open();
System.Data.SqlClient.SqlCommand myCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myCommand.CommandText=sqlString;
dataReader=myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
myCommand.Dispose();
return true;
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
dataReader=null;
return false;
}
}
public SqlDataReader getDataReader(string sqlString,SqlConnection cn)
...{
SqlDataReader dataReader=null;
try
...{
cn.Open();
System.Data.SqlClient.SqlCommand myCommand=new System.Data.SqlClient.SqlCommand(sqlString,cn);
myCommand.CommandText=sqlString;
dataReader=myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
myCommand.Dispose();
}
catch(SqlException ex)
...{
LogManager.WriteError( ex.Message + " " + ex.StackTrace );
dataReader=null;
}
return dataReader;
}
public DataSet getDataSet(string sqlString)
...{
DataSet Ds = new DataSet();
try
...{
Open();
SqlDataAdapter Da = new SqlDataAdapter(sqlString, cn);
Da.Fill(Ds);
Da.Dispose();
}
catch (SqlException ex)
...{
LogManager.WriteError(ex.Message + " " + ex.StackTrace);
Ds = null;
}
Close();
return Ds;
}
/**//// <summary>
/// 通过SQL语句获得DataSet
/// </summary>
/// <param name="sqlString">SQL语句</param>
/// <param name="cn">连接字符串名字</param>
/// <returns></returns>
public DataSet getDataSet(string sqlString, SqlConnection cn)
...{
DataSet Ds=new DataSet();
try
...{
cn.Open();
SqlDataAdapter Da = new SqlDataAdapter(sqlString, cn);
Da.Fill(Ds);
Da.Dispose();
}
catch (SqlException ex)
...{
LogManager.WriteError(ex.Message + " " + ex.StackTrace);
Ds = null;
}
return Ds;
}
public int GetRecordCount(string sqlString,SqlConnection cn)
...{
int m=0;
SqlDataReader dr=null;
if(getData("select count(*) as co from "+sqlString,cn,out dr))
...{
if(dr.Read())
...{
m=int.Parse(dr["co"].ToString());
}
dr.Close();
}
this.Close(cn);
return m;
}
public bool CheckRecord(string sqlString,SqlConnection cn)
...{
bool b=false;
SqlDataReader dr=null;
if(getData(sqlString,cn,out dr))
...{
if(dr.Read())
...{
b=true;
}
dr.Close();
}
this.Close(cn);
return b;
}
}
贴了些多余的,只要找到getDataSet()就行,然后最后在<Head></Head>里面加入javascript代码
<script type="text/javascript">
<!--
function getBid(s)...{
return document.getElementById(s);
}
function getBmc(s)...{
return document.getElementsByName(s);
}
//显示分类列表
function showNext(sid,obj)
...{
alert(sid);
if(sid==null||sid==""||sid.length<1)return;
var slt=getBid(obj);
var v=_Default.getNextClass(sid).value;
if(v!=null)
...{
;
if(v!=null&&typeof(v)=="object"&&v.Tables!=null)
...{
slt.length=0;
slt.options.add(new Option("请选择",0));
//加一个"请选择主要为了触发onchange 事件
if(obj=="DdlCity")
...{
getBid("DdlArea").options.length=0;
getBid("DdlArea").options.add(new Option("请选择",0));
}
alert(v.Tables[0].Rows.length);
for(var i=0;i<v.Tables[0].Rows.length;i++)
...{
var txt=v.Tables[0].Rows[i].txt;//这个地方要注意区分大小写
var vol=v.Tables[0].Rows[i].vol;//和dataset表的列名称要一致
slt.options.add(new Option(txt,vol));
}
}
}
return;
}
-->
</script>
作者已经写的非常经典,非常感谢,我只是做了些重用的改动,记下来方便以后学习使用。
相关文章推荐
- 轻松实现无刷新三级联动菜单[VS2005和AjaxPro] (转)
- 轻松实现无刷新三级联动菜单[VS2005与AjaxPro]【转】
- 轻松实现无刷新三级联动菜单[VS2005和AjaxPro] (转)
- 整理:dotNet Ajax实现无刷新省市县三级联动菜单
- 实现无刷新三级联动菜单[VS2005与AjaxPro]
- Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
- 实现无刷新三级联动菜单[vs2005与ajaxpro]
- 纯JSP+DWR实现三级联动下拉选择菜单实现技巧
- javascript实现日期三级联动下拉框选择菜单
- JQuery实现的三级联动菜单
- 无刷新实现无限级联动菜单(转贴)
- Ajax 实现省市县 三级联动【无刷新】三层 | 三级联动—有刷新
- asp.net 有刷新实现三级联动
- js--纯js实现省市地区三级联动
- asp.net实现ListBox、DropDownList无刷新三级联动(xmlhttp)
- 无刷新三级联动菜单从数据库获取数据(适用于firefox和ie)
- c#结合js实现无刷新省市联动菜单
- 中国地区三级联动下拉菜单的实现
- 用ajax 不用刷新页面就可实现国家,省,城市的三级联动
- Javascript 实现无刷新联动菜单(select)的方法