在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前段时间,写一个用户部门的管理页面,需要对后台获取的用户数据实现英汉检索功能。
同时,选定一个选项之后,需要触发事件与后台交互,将该用户所在的部门显示到页面右边的ListBox控件中。
一、Dojo的FilteringSelect组件实现拼音检索功能 在网上有不少相关的介绍,其中比较经典的有"海盗乱语"的关于重写Dojo的FilteringSelect组件实现拼音检索功能的介绍(地址http://cosbor.web-144.com/?p=38、http://cosbor.web-144.com/?p=52)。由于作者的Demo后台以及pinyin4j的jar包都是基于Java平台的,本人花了一点时间将其实现在.Net平台下,并成功的实现了FilteringSelect选中事件的注册。实现原理请详细参考"海盗乱语"博客中的分析,这里对.Net平台下的实现思路做简要说明,并贴出源码供大家参考(在此对作者提供的思路表示感谢!): 首先,引入Dojo工具包,在dojo目录下添加一个"test"文件夹,新建一个FilteringSelect.js文件,如下图:
FilteringSelect.js文件的作用是重写FilteringSelect组件,"海盗乱语"的博文中给出了的代码清单,为方便起见转贴如下:
View Code
define([ "dojo/_base/declare", // declare, "dojo/dom-attr", // domAttr.get "dijit/form/FilteringSelect" ], function(declare, domAttr ,FilteringSelect){ return declare("test.FilteringSelect", [FilteringSelect], { displayValueAttr:null, //新增一个自定义属性,用于指定FilteringSelect的textbox中最终显示内容的属性字段 // summary: // 覆盖dijit.form._AutoCompleterMixin的同名方法,使FilteringSelect支持displayValueAttr指定textbox最终显示内容,而不是默认显示searchAttr指定的字段内容 _announceOption: function(/*Node*/ node){ if(!node){ return; } // pull the text value from the item attached to the DOM node var newValue; if(node == this.dropDown.nextButton || node == this.dropDown.previousButton){ newValue = node.innerHTML; this.item = undefined; this.value = ''; }else{ var item = this.dropDown.items[node.getAttribute("item")]; var displayAttr = this.displayValueAttr!=null?this.displayValueAttr:this.searchAttr;//此处判断是否配置了自定义属性displayValueAttr newValue = (this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API) this.store.getValue(item, displayAttr) : item[displayAttr]).toString();//将this.searchAttr替换为displayAttr this.set('item', item, false, newValue); } // get the text that the user manually entered (cut off autocompleted text) this.focusNode.value = this.focusNode.value.substring(0, this._lastInput.length); // set up ARIA activedescendant this.focusNode.setAttribute("aria-activedescendant", domAttr.get(node, "id")); // autocomplete the rest of the option to announce change this._autoCompleteText(newValue); }, }); }); 然后,新建一个WebForm页面,放置一个FilteringSelect控件,数据源取值为页面类继承过来的userListstr字段,页面前台代码如下:
View Code
<%@ Page Title="" Language="C#" AutoEventWireup="true" CodeFile="OrgRelation.aspx.cs" Inherits="OrgRelation" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title></title> <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <link href="Scripts/dojo/dijit/themes/claro/claro.css" rel="stylesheet" type="text/css" /> <link href="Scripts/dojo/dojo/resources/dojo.css" rel="stylesheet" type="text/css" /> <script src="Scripts/dojo/dojo/dojo.js" type="text/javascript"></script> <script type="text/javascript"> //参数设置 require([ 'test/FilteringSelect', 'dojo/store/Memory', 'dojo/domReady!' ], function (FilteringSelect, Memory) { var jsonstr = '<%=userListStr%>'; var json = jQuery.parseJSON(jsonstr); var obj = {data:""}; obj['data'] = json; var selectStore = new Memory(obj); //创建FilteringSelect var testSelect = new FilteringSelect({ id: "testSelect", name: "test", value: "", store: selectStore, searchAttr: 'py', //指定输入文本框进行用来进行检索的字段 labelAttr: 'name', //指定下拉菜单中显示的字段 displayValueAttr: 'name', //指定选中下拉菜单后显示在输入框中的字段 required: false, autoComplete: false }, "testSelect"); }); //注册失去焦点事件 window.onload = function () { function selblur() { var guid = dijit.byId('testSelect').attr('value'); alert(guid); window.location.href = "OrgRelation.aspx?userId=" + guid; return false; } var sel = dojo.byId("testSelect"); dojo.connect(sel, "onblur", selblur); }; </script> </head> <body> <form id="Form1" method="post" runat="server"> <div align="center" id="title"> <strong>编辑用户部门关系</strong> </div> <div style="text-align: center;width: 100%;padding-top: 100px;font-size:15px;">选择用户:<input id="testSelect"/> </div> </form> </body> </html> 最后,在页面加载事件中获取用户数据,序列化之后,赋给protected类型的userListstr字段。其中这里引用到微软提供的获取汉字拼音的类库ChnCharInfo.dll,代码请单如下:
View Code
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using Microsoft.International.Converters.PinYinConverter; 8 using System.Text; 9 using System.Text.RegularExpressions; 10 using System.Web.Script.Serialization; 11 12 public partial class OrgRelation : System.Web.UI.Page 13 { 14 protected string userListStr = string.Empty; 15 16 protected void Page_Load(object sender, EventArgs e) 17 { 18 if (!IsPostBack) 19 { 20 GetUsers(); 21 } 22 } 23 24 //与前台页面Json对象格式对应的类 25 public class UserInfo 26 { 27 public string name { get; set; } 28 public string id { get; set; } 29 public string py { get; set; } 30 } 31 32 protected void GetUsers() 33 { 34 //获取用户信息,及每项记录的拼音简码 35 List<User> list =new BLL.User().GetUsers(); 36 List<UserInfo> UserInfoList = new List<UserInfo>(); 37 foreach (User item in list) 38 { 39 UserInfo userInfo= new UserInfo(); 40 userInfo.id = item.UserId; 41 userInfo.name = item.User Name; 42 userInfo.py = GetPY(item.UserName); 43 UserInfoList .Add(userInfo); 44 } 45 JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 46 //执行序列化 并赋值 47 userListStr = jsonSerializer.Serialize(UserInfoList); 48 } 49 50 #region 拼音检索的相关方法 51 /// <summary> 52 /// 获得一个汉字字符的拼音的字符串集合,并处理声调和空值 53 /// </summary> 54 /// <param name="ch">汉字字符</param> 55 /// <returns></returns> 56 public static List<string> GetPinyins(char ch) 57 { 58 List<string> list = new List<string>(); 59 ChineseChar cc = new ChineseChar(ch); //获得包含汉字信息的对象 60 foreach (string item in cc.Pinyins) 61 { 62 if (item != null) 63 { 64 string temp = item.Substring(0, item.Length - 1); 65 if (!list.Contains(temp)) 66 { 67 list.Add(temp); 68 } 69 } 70 } 71 return list; 72 } 73 /// <summary> 74 /// 得到一个词组的拼音的首字母字符串(多音取第一个) 75 /// </summary> 76 /// <returns></returns> 77 public static string GetPY(string str) 78 { 79 Regex reg = new Regex(@"[\u4e00-\u9fa5]"); 80 StringBuilder sb = new StringBuilder(); 81 for (int i = 0; i < str.Length; i++) 82 { 83 string ch = str[i].ToString(); 84 if (reg.IsMatch(ch)) 85 { 86 string s = GetPinyins(str[i])[0]; 87 sb.Append(s[0]); 88 } 89 else 90 { 91 sb.Append(ch); 92 } 93 } 94 return sb.ToString(); 95 } 96 #endregion 97 } 这样拼音检索的功能就完成了。不过有两点不尽人意的地方:1.使用拼音检索后,不好再使用中文检索,2.网上查了很久,没有选中项改变事件介绍,代码中只是注册了一个失去焦点事件,在与后台交互方面不太方便(可能是本人对dojo事件不熟,欢迎对dojo api有研究的大侠指点)。
二、JqueryUI的autocomplete插件实现拼音检索功能 其实JqueryUI也提供了一个非常好用的插件--autocomplete,它与ChnCharInfo.dll类库配合使用,不仅能实现同样优秀的检索功能,而且能够很好的解决上述两个问题。不妨来看看: 需要用到的相关组件和引用的类库:Jquery-UI 、汉字拼音转换语言包类库ChnCharInfo .dll和Json对象序列化类库Newtonsoft.Json.dll,如下所示:
1.WebForm的aspx页面实现: 首先引入jquery-1.8.2.js、jquery-ui-1.9.0.custom.js、jquery-ui-1.9.0.custom.css,然后在页面加载完成的事件中写如下脚本: 1 <script type="text/javascript"> 2 $(function () { 3 $("#selCompate").autocomplete({ 4 source: "GetUser.ashx", 5 minLength: 1, 6 //以下为选中事件 7 select: function (event, ui) { 8 temp = ui.item; 9 $("#hidUserId").val(temp.id); 10 $("#hidUserName").val(temp.label); 11 $("#form2").attr("action", "./OrgRelation.aspx?contactId=" + temp.id + "&contactName=" + temp.label); 12 $("#form2").submit(); 13 } 14 }); 15 $("#selCompate").val($("#hidUserName").val()) 16 }); 17 </script> 其中第4行的 source: "GetUser.ashx",是指键入字符后,发送异步请求的地址,GetUser.ashx负责向请求的客户端提供满足Json格式的用户信息;第5行的minLength: 是输入到几个字符时开始发送异步请求;第7行的select: function(event, ui){}即选中事件,ui.item表示被选中的项;第8-9行的隐藏域存值,是为了页面刷新后能重新获取该选中项的相关信息,重新写回页面以备用;第10-11行以当前选中项的id和label被为参数向OrgRelation.aspx发送post请求,是实现将选中用户的所在部门查询处来,显示到页面右侧的ListBox控件中,其服务端实现与本次讨论的内容无关,代码就不贴出来了。 页面的完整代码清单如下:
View Code
<%@ Page Title="" Language="C#" AutoEventWireup="true" CodeFile="OrgRelation.aspx.cs" Inherits="OrgRelation"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title></title> <script src="Scripts/jquery-1.8.2.js" type="text/javascript"></script> <script src="Scripts/jquery-ui-1.9.0.custom.js" type="text/javascript"></script> <link href="css/ui-lightness/jquery-ui-1.9.0.custom.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $(function () { $("#selCompate").autocomplete({ source: "GetUser.ashx", minLength: 1, //以下为选中事件 select: function (event, ui) { temp = ui.item; $("#hidUserId").val(temp.id); $("#hidUserName").val(temp.label); $("#form2").attr("action", "./OrgRelation.aspx?UserId=" + temp.id + "&UserName=" + temp.label); $("#form2").submit(); } }); $("#selCompate").val($("#hidUserName").val()) }); </script> </head> <body> <form id="form2" method="post" action="./OrgRelation.aspx" name="sendForm"></form> <form id="Form1" method="post" runat="server" > <input type="hidden" id="hidUserId" name="hidUserId" value="<%=currentUserId%>" /> <input type="hidden" id="hidUserName" name="hidUserName" value="<%=currentUserName%>"/> <asp:ScriptManager ID="ScriptManager1" 全部评论
专题导读
热门推荐
热门话题
阅读排行榜
|
请发表评论