• 使用FlexBox和Json实现类似ComboBox(类似Google的输入提示和自动)功能基于JQueryASP.NET


    很久没写代码了,也很久不写技术文了,不知道该从何写起,本文将会有点乱,请见谅。

    本文的内容是要实现一个类似ComboBox的功能,也可以说是类似Google的输入提示和自动完成,其实这样的文章网上也不少,只是在下愚笨,几乎没从众多中文文章中受益,倒是从一些E文文章里有不少的收益,最终实现了想要的效果,小庆祝一下……

    上图就是最终的效果图,文章最后将会附上整个源码的下载。

    本功能主要是借助FlexBox这个基于JQuery的开源项目:

    FlexBox Home Page:http://www.fairwaytech.com/Technology/FlexBox.aspx

    FlexBox Live Demos:http://www.fairwaytech.com/Technology/FlexBoxDemo.aspx

    进入正题,如果你也想试试,那就跟我一起来。

    本示例使用的是Northwind数据库,如果你的SQL Server中没有,也可以改成你自己的随便什么数据库,或者Google.com.hk去下一个Northwind数据库。

    数据库准备好后就该准备本文的关键工具,FlexBox。你可以从Home Page中找到下载的链接,但是从那里下载的包中并不包含JQuery基础框架,你需要自行准备,而且,官方包中还有一个小bug(后面会提到),所以我建议大家直接使用我提供的代码。点击这里下载FlexBox

    下面开始项目:

    打开Visual Web Develop 2008,新建一个项目,命名为FlexBoxTest。

    在项目中先添加一个新建项,模板选择“数据集”(你也可以使用你自己的方法,这里只是要连接数据库并获取取数据),因为是示例,所以直接使用默认命名DataSet1.xsd即可。

    在新建的数据集中添加一个TableAdapter,按照配置向导一步一步建立数据库连接(这段应该可以省略),最后添加一个表以作测试(本例添加Empolyee表)。

    为了保证文本提示功能的准备性和易用性,这里我们要新建一个查询(Query),新建查询要带有一个Where子句,内容为:where FirstName like @key+'%',可以把这个查询命名为GetDataByKey。

    对DataSet1.xsd进行保存。

    下面进行页面编写:

    先把FlexBox目录解压到项目中,然后在Default.aspx页面的<head></head>中添加如下内容:

    code
    <script src="FlexBox/js/jquery-1.2.6.min.js" type="text/javascript"></script>
    <script src="FlexBox/js/jquery.flexbox.js" type="text/javascript"></script>
    <link href="FlexBox/css/jquery.flexbox.css" rel="stylesheet" type="text/css" />

     接下来在<body></body>中添加两个<div>,内容如下:

    <div id="ffb9"></div>
    <div id="ffb9-result" style="clear:both"></div>

    其中,ffb9是要显示文本框的,而ffb9-result则是要显示操作的结果。

    然后在页面中添加JS代码,可以写到<body>中,也可以写到<head>中,内空如下:

    <script language="javascript" type="text/javascript">
        $().ready(
    function() {
            $(
    '#ffb9').flexbox('Results.aspx', {
                autoCompleteFirstMatch: 
    false,
                noResultsText: 
    '',
                onSelect: 
    function() {
                    $(
    '#ffb9-result')
                                    .html(
    'You selected "' + this.value + '", ' +
                                          
    'which has a hidden value of ' +
                                          
    this.getAttribute('hiddenValue'));
                }
            });
            $(
    '#ffb9_input').blur(function() {
                $(
    '#ffb9-result')
                                .html(
    'The value passed when the form is ' +
                                      
    'submitted is "' + this.value + '"');
            });
        });
    </script>

    注意,这里引入了一个Results.aspx文件,这个文件就是要提供输入提示的内容的。

    到这里,Default.aspx中的内容已经编写完毕,接下来,我们就要新建一个Results.aspx文件。

    在介绍Results.aspx中的内容前,先简单介绍一下FlexBox的基本工作原理(详细内容在FlexBox Home Page中都能找到):

    FlexBox对文本框进行提示的依据就是要通过另外一个符合JSON结构的文本中来实现,所谓JSON结构,Google.com.hk中会找到,而FlexBox对文本结构有特定的要求,具体如下:

    {"results":[
        {"id":"2","name":"Andrew"},
        {"id":"9","name":"Anne"}
    ]}

    所以,我们要让Results.aspx返回如上形式的JSON结构的内容。

    Results.aspx文件中不需要写入任何内容,而是要在Results.aspx.cs文件中编码:

    当然,要先进行必要的引用:

    using System.Data;
    using System.Text;
    using System.Web.Script.Serialization;

    然后写入两个新类(可以写到Results.aspx.cs中,也可以新建类文件):

    code
    [Serializable()]
    public class FlexBoxItem
    {
        
    string _id = string.Empty;
        
    string _name = string.Empty;

        
    /// <summary> 
        
    /// get/set id of flex box item 
        
    /// </summary> 
        public string id
        {
            
    get { return _id; }
            
    set { _id = value; }
        }

        
    /// <summary> 
        
    /// get/set name of flex box item 
        
    /// </summary> 
        public string name
        {
            
    get { return _name; }
            
    set { _name = value; }
        }

        
    /// <summary> 
        
    /// constructor with id and name as parameters 
        
    /// </summary> 
        
    /// <param name="fid"></param> 
        
    /// <param name="fname"></param> 
        public FlexBoxItem(string flexbox_id, string flexbox_name)
        {
            _id 
    = flexbox_id;
            _name 
    = flexbox_name;
        }

    }

    [Serializable()]
    public class FlexBoxResult
    {
        List
    <FlexBoxItem> _results = null;

        
    /// <summary> 
        
    /// get/set flexbox item list 
        
    /// </summary> 
        public List<FlexBoxItem> results
        {
            
    get { return _results; }
            
    set { _results = value; }
        }

        
    /// <summary> 
        
    /// constructor with flexbox item list 
        
    /// </summary> 
        
    /// <param name="_list"></param> 
        public FlexBoxResult(List<FlexBoxItem> _list)
        {
            _results 
    = _list;
        }

    接下来要在Results类中写入如下代码:

    代码
    public partial class Results : System.Web.UI.Page
    {
        
    private DataSet1TableAdapters.EmployeesTableAdapter _EmployeeTableAdapter = null;
        
    private DataSet1TableAdapters.EmployeesTableAdapter Adapter
        {
            
    get
            {
                
    if (_EmployeeTableAdapter == null)
                {
                    _EmployeeTableAdapter 
    = new FlexBoxTest.DataSet1TableAdapters.EmployeesTableAdapter();
                }
                
    return _EmployeeTableAdapter;
            }
        }
        
    protected void Page_Load(object sender, EventArgs e)
        {
            
    //q=a&p=1&s=10&contentType=application/json; charset=utf-8
            DataSet1.EmployeesDataTable etb = new DataSet1.EmployeesDataTable();
            
    if (Request.QueryString["q"== null)
            {
                etb 
    = Adapter.GetData();
            }
            
    else
            {
                etb 
    = Adapter.GetDataByKey(Request.QueryString["q"].ToString());
            }

            List
    <FlexBoxItem> _flexList = new List<FlexBoxItem>();
            
    foreach (DataSet1.EmployeesRow dr in etb.Rows)
            {
                _flexList.Add(
    new FlexBoxItem(dr["EmployeeID"].ToString(), dr["FirstName"].ToString()));
            }
            FlexBoxResult _flexBoxResult 
    = new FlexBoxResult(_flexList);

            JavaScriptSerializer _jss 
    = new JavaScriptSerializer();
            StringBuilder _jsonResult 
    = new StringBuilder();
            _jss.Serialize(_flexBoxResult, _jsonResult);

            Response.ContentType 
    = "application/json";
            Response.Write(_jsonResult.ToString());
            Response.End();
        }
    }

    到此,就一切OK了,生成项目,并运行Default.aspx,你将会看到想要的结果。

    下面提供本示例完整的源码下载:FlexBoxTest.zip

    最后说一下FlexBox中的一个bug,就是文本框中无法输入小写字母q,在本例中已经修正了这个问题。

    有事先闪,回头再来完善。


  • 相关阅读:
    取2个日期间的天数
    C#代码与JAVASCRIPT函数的相互调用
    ASP.NET验证码(3种)
    VS2008自带SQL 2005如何使用
    文本框默认有一个值,然后鼠标点上去那个值就清空
    远程桌面连接会话超时或者被限制改组策略也没用的时候就这么解决
    关于CComboBox的使用,编辑项的文字
    vc 剪切板 unicode
    Linux 防火墙、SELinux 的开启和关闭
    MSSQLSERVER服务不能启动
  • 原文地址:https://www.cnblogs.com/chenqiang001/p/1805273.html
Copyright © 2020-2023  润新知