This is a migrated thread and some comments may be shown as answers.

How To Emulate Facebook Search Behavior Using A RadComboBox

0 Answers 146 Views
ComboBox
This is a migrated thread and some comments may be shown as answers.
Troy
Top achievements
Rank 1
Troy asked on 09 May 2011, 09:23 PM
If you want to emulate the search behavior of Facebook, I have included sample code below. The Facebook search allows the user to enter text in the input field and highlights the first item in the results. If the user presses the enter key after typing in a name, the first item in the search results is sent to the server on the postback. Thanks goes to Dimitar at Telerik for this solution.

<form id="form1" runat="server">
<telerik:RadScriptManager ID="RadScriptManager1" runat="server" />
<asp:Panel ID="Panel1" DefaultButton="Button1" runat="server">
    <telerik:RadComboBox
        ID="RadComboBox1"
        AllowCustomText="true"
        AutoCompleteSeparator=","
        EnableLoadOnDemand="true"
        EnableTextSelection="true"
        MarkFirstMatch="true"
        OnClientDropDownOpening="onClientDropDownOpening"
        OnClientItemsRequested="onClientItemsRequested"
        OnClientSelectedIndexChanging="OnClientSelectedIndexChanging"
        Skin=""
        runat="server">
        <CollapseAnimation Type="None" />
        <ExpandAnimation Type="None" />
        <WebServiceSettings Path="WebService1.asmx" Method="GetSearchResults" />
    </telerik:RadComboBox>
    <asp:Button ID="Button1" Text="Submit" OnClick="Button1_Click" runat="server" />
</asp:Panel>
<asp:Label ID="Label1" runat="server" />
<script type="text/javascript">
    var flag;
    var $ = $telerik.$;
    var $T = Telerik.Web.UI;
    var $p = Telerik.Web.UI.RadComboBox.prototype;
  
    function pageLoad()
    {
        flag = true;
    }
  
    function OnClientSelectedIndexChanging(sender, args)
    {
        var domEvent = args.get_domEvent();
        if (domEvent.type == "click")
        {
            flag = true;
            sender.set_text(args.get_item().get_text());
        }
    }
  
    $p.set_text = function (value)
    {
        value = $T.RadComboBox.htmlDecode(value);
        this.get_element().value = value;
        this._suppressChange = true;
        var inputElement = this.get_inputDomElement();
  
        if (flag)
        {
            inputElement.value = value;
        }
  
        inputElement.className = "rcbInput";
        this.set_value("");
  
        if (inputElement.fireEvent && document.createEventObject)
        {
            var eventObject = document.createEventObject();
            inputElement.fireEvent("onchange", eventObject);
        }
        else if (inputElement.dispatchEvent)
        {
            var canBubble = true;
            var eventObject = document.createEvent("HTMLEvents");
            eventObject.initEvent("change", canBubble, true);
            inputElement.dispatchEvent(eventObject);
        }
  
        this._suppressChange = false;
        this._ensureChildControls();
        this.updateClientState();
    },
  
    $p._onKeyDown = function (e)
    {
        flag = false;
        var keyCode = e.keyCode || e.which;
  
        if (keyCode == $T.Keys.Escape)
        {
            e.preventDefault();
        }
  
        if ($telerik.isIE && keyCode != $T.Keys.Down && keyCode != $T.Keys.Up)
        {
            this._updateFilterText = true;
        }
  
        if (!this._fireEvents || this._ajaxRequest) return;
  
        if ($telerik.isIE9 && (keyCode == 8 || keyCode == 127))
        {
            this._compensateValuePropertyChangeEvent = true;
        }
  
        if (!e) e = event;
        {
            this.raise_onClientKeyPressing(e);
        }
  
        this._lastKeyCode = keyCode;
  
        if (keyCode == $T.Keys.Escape && this.get_dropDownVisible())
        {
            this._hideDropDown(e);
            return;
        }
        else if (keyCode === $T.Keys.Enter)
        {
  
            if (this.get_dropDownVisible())
            {
                this._hideDropDown(e);
            }
  
            var itemToBeSelected = this.findItemByText(this.get_text());
  
            if (this.get_allowCustomText() && !this.get_markFirstMatch() && !itemToBeSelected)
            {
                if (this.raise_selectedIndexChanging(null, e) == false)
                {
                    var selectedItem = this.get_selectedItem();
                    var highlightedItem = this.get_highlightedItem();
  
                    if (selectedItem)
                    {
                        selectedItem.set_selected(false);
                    }
  
                    if (highlightedItem)
                    {
                        highlightedItem.unHighlight();
                    }
  
                    this.set_selectedItem(null);
                    this.set_selectedIndex(null);
                    this.set_highlightedItem(null);
  
                    this.raise_selectedIndexChanged(null, e);
  
                    var command = { Command: "Select", Index: -1 };
                    this.postback(command);
                }
            }
            else
            {
                this._performSelect(this.get_highlightedItem(), e);
            }
  
            if (this.get_markFirstMatch())
            {
                var textLength = this.get_text().length;
            }
  
            return;
        }
        else if (keyCode === $T.Keys.Down)
        {
            e.returnValue = false;
            if (e.altKey)
            {
                this._toggleDropDown(e);
                return;
            }
  
            this.highlightNextItem(null);
  
            if (e.preventDefault)
            {
                e.preventDefault();
            }
  
            return;
        }
        else if (keyCode === $T.Keys.Up)
        {
            e.returnValue = false;
            if (e.altKey)
            {
                this._toggleDropDown(e);
                return;
            }
  
            this.highlightPreviousItem();
  
            if (e.preventDefault)
            {
                e.preventDefault();
            }
  
            return;
        }
        else if (keyCode === $T.Keys.Tab)
        {
            if (this.get_dropDownVisible())
            {
                this._hideDropDown(e);
            }
  
            this._raiseClientBlur(e);
            this._selectItemOnBlur(e);
            this._applyEmptyMessage();
            this._focused = false;
            return;
        }
  
        if (keyCode == $T.Keys.Left || keyCode == $T.Keys.Right)
        {
            return;
        }
  
        if (keyCode >= $T.Keys.Numpad0 && keyCode <= $T.Keys.Numpad9)
        {
            keyCode -= ($T.Keys.Numpad0 - $T.Keys.Zero);
        }
  
        var letter = String.fromCharCode(keyCode);
  
        if (letter && (!e.altKey) && !(this.get_enableLoadOnDemand() || !this.get_readOnly()))
        {
            this.highlightNextItem(letter);
            return;
        }
    };
  
  
    function onClientDropDownOpening(sender, eventArgs)
    {
        if (sender._filterText.length < 1)
        {
            eventArgs.set_cancel(true);
        }
    }
  
    function onClientItemsRequested(sender, eventArgs)
    {
  
        if (sender.get_items().get_count() > 0)
        {
  
            $('.rcbSlide').show();
        }
        else
        {
            $('.rcbSlide').hide();
        }
    }
</script>
</form>

using System;
using System.Web.UI;
  
namespace WebApplication1
{
    public partial class WebForm1 : Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Text = RadComboBox1.SelectedValue;
            RadComboBox1.Text = string.Empty;
        }
    }
}

using System.Collections.Generic;
using System.ComponentModel;
using System.Web.Script.Services;
using System.Web.Services;
using Telerik.Web.UI;
  
namespace WebApplication1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    [ScriptService]
    public class WebService1 : WebService
    {
        [WebMethod]
        public RadComboBoxItemData[] GetSearchResults(object context)
        {
            IDictionary<string, object> contextDictionary = (IDictionary<string, object>)context;
            string searchString = contextDictionary["Text"].ToString();
  
            if (searchString.Length > 1)
            {
                List<RadComboBoxItemData> results = new List<RadComboBoxItemData>();
                results.Add(new RadComboBoxItemData { Text = "School", Value = "1" });
                results.Add(new RadComboBoxItemData { Text = "Text Book", Value = "2" });
                results.Add(new RadComboBoxItemData { Text = "Ruler", Value = "3" });
                results.Add(new RadComboBoxItemData { Text = "Chalk", Value = "4" });
                results.Add(new RadComboBoxItemData { Text = "Teacher", Value = "5" });
                results.Add(new RadComboBoxItemData { Text = "Math", Value = "6" });
                results.Add(new RadComboBoxItemData { Text = "Science", Value = "7" });
                results.Add(new RadComboBoxItemData { Text = "Language", Value = "8" });
                results.Add(new RadComboBoxItemData { Text = "Music", Value = "9" });
                results.Add(new RadComboBoxItemData { Text = "Desk", Value = "10" });
                return results.ToArray();
            }
            else
            {
                return new RadComboBoxItemData[0];
            }
        }
    }
}

No answers yet. Maybe you can help?

Tags
ComboBox
Asked by
Troy
Top achievements
Rank 1
Share this question
or