• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.Net中实现中英文复合检索文本框

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  前段时间,写一个用户部门的管理页面,需要对后台获取的用户数据实现英汉检索功能。 

       

  同时,选定一个选项之后,需要触发事件与后台交互,将该用户所在的部门显示到页面右边的ListBox控件中。

         

        

  一、Dojo的FilteringSelect组件实现拼音检索功能

  在网上有不少相关的介绍,其中比较经典的有"海盗乱语"的关于重写Dojo的FilteringSelect组件实现拼音检索功能的介绍(地址http://cosbor.web-144.com/?p=38http://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" 
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[ASP.NET笔记]6.导航控件发布时间:2022-07-10
下一篇:
Asp.netCheckBoxList多选提示发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap