您的位置:首页 > 其它

三级地区无刷新实现菜单联动

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>

作者已经写的非常经典,非常感谢,我只是做了些重用的改动,记下来方便以后学习使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: