[分享]新封装的一个实现无刷新连动下拉列表类

近期由于项目需要实现大量的无刷新的连动下拉列表,感觉每个页面都copy一份javascript脚本的方法有点蠢,就产生了封一个通用类的念头,先是我同事myw研究了一个版本(这里特别感谢47.gif),感觉他的那个使用的限制太多,就在他的基础上改造了一下,产生了下面的版本,虽然还有一定的使用限制,但总的来说还是比较好用的,具体说说实现及使用方法吧!

1.实现方法:
其实原理很简单,先通过cs脚本初始化javascript脚本,再把javascript脚本通HttpContext.Current.Response.Write写入客户端,当然首先还需对一对DropDownList控件进行简单处理,限定是DropDownList的数据源datasource必须使用datatable,不过可以通过根据需要改造来适应其他类型的数据源;

直接看代码吧,还是比较简单的

None.gif using  System;
None.gif
using  System.Data;
None.gif
using  System.Web;
None.gif
using  System.Web.UI;
None.gif
using  System.Web.UI.WebControls;
None.gif
None.gif
namespace  NoRefreshJointDDL
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// 实现两个无刷新联动的DropDownList
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class CNoFlashDownList:System.Web.UI.Page
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
成员变量#region 成员变量
InBlock.gif
InBlock.gif        
//注册控件
InBlock.gif
        private System.Web.UI.WebControls.DropDownList ddlDriver;    //驱动方下拉列表
InBlock.gif
        private System.Web.UI.WebControls.DropDownList ddlDrivener;    //从动方下拉列表
InBlock.gif        
InBlock.gif        
//数据源
InBlock.gif
        private DataTable dtDriver;        //主动方数据源
InBlock.gif
        private DataTable dtDrivener;    //从动方数据源
InBlock.gif
InBlock.gif        
//驱动部分
InBlock.gif
        private string strDriverValueField            = "";    //编码列
InBlock.gif
        private string strDriverTextField            = "";    //显示列
InBlock.gif
        private string strDriverRelation            = "";    //关系列
InBlock.gif
InBlock.gif        
//从动部分
InBlock.gif
        private string strDrivenerValueField        = "";    //编码列
InBlock.gif
        private string strDrivenerTextField            = "";    //显示列
InBlock.gif
        private string strDrivenerRelation            = "";    //关系列
InBlock.gif

ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
成员属性#region 成员属性
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 驱动方关系列
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        public string DriverRelation
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
setdot.gif{strDriverRelation = value;}
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 从动方关系列
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        public string DrivenerRelation
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
setdot.gif{strDrivenerRelation = value;}
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
构造函数#region 构造函数
InBlock.gif        
public CNoFlashDownList()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{}
ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
实现初始化下拉列表框#region 实现初始化下拉列表框
InBlock.gif
InBlock.gif        
//得到下拉列表选定值所在数据源行的行号
InBlock.gif
        private int GetSelectRowID(DropDownList ddl)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
string strValueFiled = ddl.DataValueField;
InBlock.gif            
string strSelectValue =    ddl.SelectedValue.ToString();
InBlock.gif
InBlock.gif            DataView dv 
= new DataView((DataTable)(ddl.DataSource));
InBlock.gif            dv.Sort 
= strValueFiled;
InBlock.gif
InBlock.gif            
return dv.Find(strSelectValue);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 注册下拉列表,添加客户端脚本
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="driver">驱动方下拉列表</param>
InBlock.gif        
/// <param name="drivener">从动方下拉列表</param>
ExpandedSubBlockEnd.gif       
public void RegisterDropDownList(DropDownList driver,DropDownList drivener)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//取得准备数据
InBlock.gif
            ddlDriver    = driver;
InBlock.gif            ddlDrivener 
= drivener;
InBlock.gif
InBlock.gif            strDriverTextField 
= ddlDriver.DataTextField;
InBlock.gif            strDriverValueField 
= ddlDriver.DataValueField;
InBlock.gif
InBlock.gif            strDrivenerTextField 
= ddlDrivener.DataTextField;
InBlock.gif            strDrivenerValueField 
= ddlDrivener.DataValueField;
InBlock.gif
InBlock.gif            dtDriver 
= (DataTable)(ddlDriver.DataSource);
InBlock.gif            dtDrivener 
= (DataTable)(ddlDrivener.DataSource);
InBlock.gif
InBlock.gif            
//获取选定值,并过滤从动下拉列表的数据
InBlock.gif
            int iIndex = GetSelectRowID(ddlDriver);
InBlock.gif
InBlock.gif            DataRow drFilter 
= dtDriver.Rows[iIndex];
InBlock.gif            
string strRelate = drFilter[strDriverRelation].ToString().Trim();
InBlock.gif
InBlock.gif            DataView dv 
= new DataView(dtDrivener);
InBlock.gif            dv.RowFilter 
= strDriverRelation + "='"+strRelate+"'";
InBlock.gif
InBlock.gif            ddlDrivener.Items.Clear();
InBlock.gif            ddlDrivener.DataSource 
= dv;
InBlock.gif            ddlDrivener.DataTextField 
= strDrivenerTextField;
InBlock.gif            ddlDrivener.DataValueField 
= strDrivenerValueField;
InBlock.gif            ddlDrivener.DataBind();
InBlock.gif            
InBlock.gif            
//加入客户端脚本-初始化部分
InBlock.gif
            string CilentScript = @" <script language=""javascript"">
InBlock.gif            
InBlock.gif            var countDriver;
InBlock.gif            var countDrivener;
InBlock.gif
InBlock.gif            countDriver=0;
InBlock.gif            countDrivener=0;
InBlock.gif
InBlock.gif            ArrayDriver = new Array();
InBlock.gif            ArrayDrivener = new Array();
";
InBlock.gif
InBlock.gif            
//初始化数组值,并加入客户端脚本
InBlock.gif
            DataRow drDriver = null;
InBlock.gif            
for(int i = 0;i <dtDriver.Rows.Count ;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                drDriver 
= dtDriver.Rows[i];
ExpandedSubBlockStart.gifContractedSubBlock.gif                CilentScript 
+= String.Format("ArrayDriver[countDriver++] = new Array(\"dot.gif{0}\",\"dot.gif{1}\",\"dot.gif{2}\");\n", drDriver[strDriverValueField].ToString(),drDriver[strDriverTextField].ToString(), drDriver[strDriverRelation].ToString());
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            DataRow drDrivener 
= null;
InBlock.gif            
for(int i = 0;i <dtDrivener.Rows.Count ;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                drDrivener 
= dtDrivener.Rows[i];
ExpandedSubBlockStart.gifContractedSubBlock.gif                CilentScript 
+= String.Format("ArrayDrivener[countDrivener++] = new Array(\"dot.gif{0}\",\"dot.gif{1}\",\"dot.gif{2}\");\n", drDrivener[strDrivenerValueField].ToString(),drDrivener[strDrivenerTextField].ToString(), drDrivener[strDrivenerRelation].ToString());
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
//注册驱动下拉列表的项改变事件
InBlock.gif
            string ddlDriverID = ddlDriver.ID.ToString().Trim();
InBlock.gif            
string ddlDrivenerID = ddlDrivener.ID.ToString().Trim();
InBlock.gif
InBlock.gif            ddlDriver.Attributes[
"onchange"= "javascript:changedownlist(document.Form1," + ddlDriverID + "," + ddlDrivenerID + ");";
InBlock.gif
InBlock.gif            
//加入客户端脚本-连动部分
InBlock.gif
            CilentScript += @"        
InBlock.gif            function changedownlist(myfrm,Driver,Drivener)
InBlock.gif            {
InBlock.gif                var SelectedBigId,i,j,SelectDataType;
InBlock.gif                
InBlock.gif                for (i= Drivener.options.length-1;i>=0 ;--i)      
InBlock.gif                {
InBlock.gif                    Drivener.options[i] = null; 
InBlock.gif                }
InBlock.gif            
InBlock.gif                SelectedBigId = Driver.options[Driver.selectedIndex].value;
InBlock.gif            
InBlock.gif                for (i=0;i<ArrayDriver.length;i++)
InBlock.gif                {
InBlock.gif                    if (SelectedBigId == ArrayDriver[i][0])
InBlock.gif                    {
InBlock.gif                        SelectDataType = ArrayDriver[i][2];
InBlock.gif                        break;
InBlock.gif                    }
InBlock.gif                }
InBlock.gif            
InBlock.gif                j = 0;    
InBlock.gif                
InBlock.gif                for (i=0 ;i< ArrayDrivener.length ;i++)      
InBlock.gif                {
InBlock.gif                    if (SelectDataType == ArrayDrivener[i][2])
InBlock.gif                    {
InBlock.gif                        Drivener.options[j] = new Option(ArrayDrivener[i][1],ArrayDrivener[i][0]); 
InBlock.gif                        ++j;
InBlock.gif                    }
InBlock.gif                }
InBlock.gif            }
InBlock.gif            </script>
";
InBlock.gif
InBlock.gif            
//将脚本写入客户端
InBlock.gif
            HttpContext.Current.Response.Write(CilentScript);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif       
#endregion

InBlock.gif       
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

2.使用方法,附测试源码:
首先是取一对DropDownList控件的数据源,并绑定它们
接着当然是实例化类CNoFlashDownList了,如果用的多可以考虑封成静态的
然后是指定它们各自用于连动的关系列,这里暴露的两个属性DriverRelation和DrivenerRelation
uc.DriverRelation = "DataType";
uc.DrivenerRelation = "DataType";
最后是调用RegisterDropDownList方法注册控件了

测试的代码

None.gif protected  System.Web.UI.WebControls.DropDownList ddlDrivener;
None.gif        
protected  System.Web.UI.WebControls.DropDownList ddlDriver;
None.gif    
None.gif        
private   void  Page_Load( object  sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if (!IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                DataTable dtType 
= new DataTable();
InBlock.gif                dtType.Columns.Add(
"TypeCode");
InBlock.gif                dtType.Columns.Add(
"TypeName");
InBlock.gif                dtType.Columns.Add(
"DataType");
InBlock.gif
InBlock.gif                DataTable dtValue 
= new DataTable("MyTable");
InBlock.gif
InBlock.gif                dtValue.Columns.Add(
"ValueCode");
InBlock.gif                dtValue.Columns.Add(
"ValueName");
InBlock.gif                dtValue.Columns.Add(
"DataType");
InBlock.gif
InBlock.gif                DataRow Dr 
= dtType.NewRow();
InBlock.gif                Dr[
"TypeCode"= "AllMoney";
InBlock.gif                Dr[
"TypeName"= "应发工资";
InBlock.gif                Dr[
"DataType"= "Num";
InBlock.gif                dtType.Rows.Add(Dr);
InBlock.gif
InBlock.gif                DataRow Dr1 
= dtType.NewRow();
InBlock.gif                Dr1[
"TypeCode"= "Uid";
InBlock.gif                Dr1[
"TypeName"= "身份证号码";
InBlock.gif                Dr1[
"DataType"= "Char";
InBlock.gif                dtType.Rows.Add(Dr1);
InBlock.gif
InBlock.gif                DataRow Dr2 
= dtType.NewRow();
InBlock.gif                Dr2[
"TypeCode"= "Worker";
InBlock.gif                Dr2[
"TypeName"= "行政职务";
InBlock.gif                Dr2[
"DataType"= "Meg";
InBlock.gif                dtType.Rows.Add(Dr2);
InBlock.gif                
InBlock.gif                
//开始添加第二个表中的内容
InBlock.gif
                DataRow Dr3 = dtValue.NewRow();
InBlock.gif                Dr3[
"ValueCode"= "=";
InBlock.gif                Dr3[
"ValueName"= "等于";
InBlock.gif                Dr3[
"DataType"= "Num";
InBlock.gif                dtValue.Rows.Add(Dr3);
InBlock.gif
InBlock.gif                DataRow Dr4 
= dtValue.NewRow();
InBlock.gif                Dr4[
"ValueCode"= "<>";
InBlock.gif                Dr4[
"ValueName"= "不等于";
InBlock.gif                Dr4[
"DataType"= "Char";
InBlock.gif                dtValue.Rows.Add(Dr4);
InBlock.gif
InBlock.gif                DataRow Dr5 
= dtValue.NewRow();
InBlock.gif                Dr5[
"ValueCode"= "like";
InBlock.gif                Dr5[
"ValueName"= "相似";
InBlock.gif                Dr5[
"DataType"= "Char";
InBlock.gif                dtValue.Rows.Add(Dr5);
InBlock.gif
InBlock.gif                DataRow Dr6 
= dtValue.NewRow();
InBlock.gif                Dr6[
"ValueCode"= ">";
InBlock.gif                Dr6[
"ValueName"= "大于";
InBlock.gif                Dr6[
"DataType"= "Num";
InBlock.gif                dtValue.Rows.Add(Dr6);
InBlock.gif
InBlock.gif
InBlock.gif                DataRow Dr7 
= dtValue.NewRow();
InBlock.gif                Dr7[
"ValueCode"= "=";
InBlock.gif                Dr7[
"ValueName"= "不等于";
InBlock.gif                Dr7[
"DataType"= "Meg";
InBlock.gif                dtValue.Rows.Add(Dr7);
InBlock.gif
InBlock.gif                DataRow Dr8 
= dtValue.NewRow();
InBlock.gif                Dr8[
"ValueCode"= "=";
InBlock.gif                Dr8[
"ValueName"= "等于";
InBlock.gif                Dr8[
"DataType"= "Meg";
InBlock.gif                dtValue.Rows.Add(Dr8); 
InBlock.gif
InBlock.gif                CNoFlashDownList uc 
= new CNoFlashDownList();
InBlock.gif
InBlock.gif                ddlDriver.DataSource 
= dtType;
InBlock.gif                ddlDriver.DataTextField 
= "TypeName";
InBlock.gif                ddlDriver.DataValueField 
= "TypeCode";
InBlock.gif                ddlDriver.DataBind();
InBlock.gif
InBlock.gif                ddlDriver.SelectedIndex 
= 2;
InBlock.gif
InBlock.gif                ddlDrivener.DataSource 
= dtValue;
InBlock.gif                ddlDrivener.DataTextField 
="ValueName";
InBlock.gif                ddlDrivener.DataValueField 
= "ValueCode";
InBlock.gif                ddlDrivener.DataBind();
InBlock.gif
InBlock.gif                uc.DriverRelation 
= "DataType";
InBlock.gif                uc.DrivenerRelation 
= "DataType";
InBlock.gif
InBlock.gif                uc.RegisterDropDownList(ddlDriver,ddlDrivener);
ExpandedSubBlockEnd.gif                }

ExpandedBlockEnd.gif        }

3.存在的问题
上面的实现在一个页面只有一对连动的DropDownList控件时完全满足需求,但是如果出现并注册多对时就会产生紊乱了,后来想到重载RegisterDropDownList方法,加一个唯一区别的对标识,重复写段带区别的脚本到客户端,但是还是感觉有点土,因为会重复出现一些类似的脚本,违背了xp编程原则;

希望有兴趣的同仁,对上面的实现,以及我提出的问题提点意见和解决方案,先谢谢了……

下载:NoRefreshJointDDL.rar

转载于:https://www.cnblogs.com/Hedonister/archive/2005/07/08/188420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值