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

    仿照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;
        
定义数据库操作不带参数的函数
        
        
定义数据库操作带参数的函数
        
        
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 >
作者已经写的非常经典,非常感谢,我只是做了些重用的改动,记下来方便以后学习使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值