zoukankan      html  css  js  c++  java
  • 使用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,在本例中已经修正了这个问题。

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


  • 相关阅读:
    Apple Swift编程语言入门中文教程
    WWDC 2014 Session 208/231 CloudKit 读书笔记
    微信开源项目解说使用公开课
    winform 实现彩票功能
    c#+windows api SetWindowsHookEx 全局钩子 demo 下载
    GPS-Graph Processing System Graph Coloring算法分析 (三)
    00105_UDP和TCP协议
    雷林鹏分享:jQuery EasyUI 表单
    雷林鹏分享:jQuery EasyUI 表单
    雷林鹏分享:jQuery EasyUI 表单
  • 原文地址:https://www.cnblogs.com/chenqiang001/p/1805273.html
Copyright © 2011-2022 走看看