[分享]新封装的一个实现无刷新连动下拉列表类
近期由于项目需要实现大量的无刷新的连动下拉列表,感觉每个页面都copy一份javascript脚本的方法有点蠢,就产生了封一个通用类的念头,先是我同事myw研究了一个版本(这里特别感谢
),感觉他的那个使用的限制太多,就在他的基础上改造了一下,产生了下面的版本,虽然还有一定的使用限制,但总的来说还是比较好用的,具体说说实现及使用方法吧!
1.实现方法:
其实原理很简单,先通过cs脚本初始化javascript脚本,再把javascript脚本通HttpContext.Current.Response.Write写入客户端,当然首先还需对一对DropDownList控件进行简单处理,限定是DropDownList的数据源datasource必须使用datatable,不过可以通过根据需要改造来适应其他类型的数据源;
直接看代码吧,还是比较简单的
2.使用方法,附测试源码:
首先是取一对DropDownList控件的数据源,并绑定它们
接着当然是实例化类CNoFlashDownList了,如果用的多可以考虑封成静态的
然后是指定它们各自用于连动的关系列,这里暴露的两个属性DriverRelation和DrivenerRelation
uc.DriverRelation = "DataType";
uc.DrivenerRelation = "DataType";
最后是调用RegisterDropDownList方法注册控件了
测试的代码
protected System.Web.UI.WebControls.DropDownList ddlDrivener;
protected System.Web.UI.WebControls.DropDownList ddlDriver;
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
DataTable dtType = new DataTable();
dtType.Columns.Add("TypeCode");
dtType.Columns.Add("TypeName");
dtType.Columns.Add("DataType");
DataTable dtValue = new DataTable("MyTable");
dtValue.Columns.Add("ValueCode");
dtValue.Columns.Add("ValueName");
dtValue.Columns.Add("DataType");
DataRow Dr = dtType.NewRow();
Dr["TypeCode"] = "AllMoney";
Dr["TypeName"] = "应发工资";
Dr["DataType"] = "Num";
dtType.Rows.Add(Dr);
DataRow Dr1 = dtType.NewRow();
Dr1["TypeCode"] = "Uid";
Dr1["TypeName"] = "身份证号码";
Dr1["DataType"] = "Char";
dtType.Rows.Add(Dr1);
DataRow Dr2 = dtType.NewRow();
Dr2["TypeCode"] = "Worker";
Dr2["TypeName"] = "行政职务";
Dr2["DataType"] = "Meg";
dtType.Rows.Add(Dr2);
//开始添加第二个表中的内容
DataRow Dr3 = dtValue.NewRow();
Dr3["ValueCode"] = "=";
Dr3["ValueName"] = "等于";
Dr3["DataType"] = "Num";
dtValue.Rows.Add(Dr3);
DataRow Dr4 = dtValue.NewRow();
Dr4["ValueCode"] = "<>";
Dr4["ValueName"] = "不等于";
Dr4["DataType"] = "Char";
dtValue.Rows.Add(Dr4);
DataRow Dr5 = dtValue.NewRow();
Dr5["ValueCode"] = "like";
Dr5["ValueName"] = "相似";
Dr5["DataType"] = "Char";
dtValue.Rows.Add(Dr5);
DataRow Dr6 = dtValue.NewRow();
Dr6["ValueCode"] = ">";
Dr6["ValueName"] = "大于";
Dr6["DataType"] = "Num";
dtValue.Rows.Add(Dr6);

DataRow Dr7 = dtValue.NewRow();
Dr7["ValueCode"] = "=";
Dr7["ValueName"] = "不等于";
Dr7["DataType"] = "Meg";
dtValue.Rows.Add(Dr7);
DataRow Dr8 = dtValue.NewRow();
Dr8["ValueCode"] = "=";
Dr8["ValueName"] = "等于";
Dr8["DataType"] = "Meg";
dtValue.Rows.Add(Dr8); 
CNoFlashDownList uc = new CNoFlashDownList();
ddlDriver.DataSource = dtType;
ddlDriver.DataTextField = "TypeName";
ddlDriver.DataValueField = "TypeCode";
ddlDriver.DataBind();
ddlDriver.SelectedIndex = 2;
ddlDrivener.DataSource = dtValue;
ddlDrivener.DataTextField ="ValueName";
ddlDrivener.DataValueField = "ValueCode";
ddlDrivener.DataBind();
uc.DriverRelation = "DataType";
uc.DrivenerRelation = "DataType";
uc.RegisterDropDownList(ddlDriver,ddlDrivener);
}
}3.存在的问题
上面的实现在一个页面只有一对连动的DropDownList控件时完全满足需求,但是如果出现并注册多对时就会产生紊乱了,后来想到重载RegisterDropDownList方法,加一个唯一区别的对标识,重复写段带区别的脚本到客户端,但是还是感觉有点土,因为会重复出现一些类似的脚本,违背了xp编程原则;
希望有兴趣的同仁,对上面的实现,以及我提出的问题提点意见和解决方案,先谢谢了……
下载:NoRefreshJointDDL.rar
[分享]新封装的一个实现无刷新连动下拉列表类(最新版本)

浙公网安备 33010602011771号