Thursday, December 5, 2013

Implement Autocomplete in asp.net dropdownlist with dropdown onchange event

First Step: Reference the js links to your page

 <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
    <link rel="stylesheet" href="/resources/demos/style.css">


Second Step : Add css and scripts to your page to do autocomplete

  <style>
  .custom-combobox {
    position: relative;
    display: inline-block;
  }
  .custom-combobox-toggle {
    position: absolute;
    top: 0;
    bottom: 0;
    margin-left: -1px;
    padding: 0;
    /* support: IE7 */
    *height: 1.7em;
    *top: 0.1em;
  }
  .custom-combobox-input {
    margin: 0;
    padding: 0.3em;
  }
  .ui-state-default, .ui-autocomplete
  {
      background-image:none !important;
      background-color:White !important;
      font-family:"open Sans" !important;
      font-weight:400 !important;
      font-size:1rem !important;
  }
  </style>


<script>
        (function ($) {
            $.widget("custom.combobox", {
                _create: function () {
                    this.wrapper = $("<span>")
          .addClass("custom-combobox")
          .insertAfter(this.element);

                    this.element.hide();
                    this._createAutocomplete();
                    this._createShowAllButton();
                },

                _createAutocomplete: function () {
                    var selected = this.element.children(":selected"),
          value = selected.val() ? selected.text() : "";

                    this.input = $("<input>")
          .appendTo(this.wrapper)
          .val(value)
          .attr("title", "")
          .addClass("custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left")
          .autocomplete({
              delay: 0,
              minLength: 0,
              source: $.proxy(this, "_source")
          })
          .tooltip({
              tooltipClass: "ui-state-highlight"
          });

                    this._on(this.input, {
                        autocompleteselect: function (event, ui) {
                            ui.item.option.selected = true;
                            this._trigger("select", event, {
                                item: ui.item.option
                            });
                            // __doPostBack('<%= combobox.UniqueID %>', '');
                        },

                        autocompletechange: "_removeIfInvalid"
                    });
                },

                _createShowAllButton: function () {
                    var input = this.input,
          wasOpen = false;

                    $("<a>")
          .attr("tabIndex", -1)
                    //.attr("title", "Show All Items")
          .tooltip()
          .appendTo(this.wrapper)
          .button({
              icons: {
                  primary: "ui-icon-triangle-1-s"
              },
              text: false
          })
          .removeClass("ui-corner-all")
          .addClass("custom-combobox-toggle ui-corner-right")
          .mousedown(function () {
              wasOpen = input.autocomplete("widget").is(":visible");
          })
          .click(function () {
              input.focus();

              // Close if already visible
              if (wasOpen) {
                  return;
              }

              // Pass empty string as value to search for, displaying all results
              input.autocomplete("search", "");
          });
                },

                _source: function (request, response) {
                    var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
                    response(this.element.children("option").map(function () {
                        var text = $(this).text();
                        if (this.value && (!request.term || matcher.test(text)))
                            return {
                                label: text,
                                value: text,
                                option: this
                            };
                    }));
                },

                _removeIfInvalid: function (event, ui) {
                    // Selected an item, nothing to do
                    if (ui.item) {
                        return;
                    }

                    // Search for a match (case-insensitive)
                    var value = this.input.val(),
          valueLowerCase = value.toLowerCase(),
          valid = false;
                    this.element.children("option").each(function () {
                        if ($(this).text().toLowerCase() === valueLowerCase) {
                            this.selected = valid = true;
                            return false;
                        }
                    });

                    // Found a match, nothing to do
                    if (valid) {

                        return;
                    }

                    // Remove invalid value
                    this.input
          .val("")
          .attr("title", value + " didn't match any item")
          .tooltip("open");
                    this.element.val("");
                    this._delay(function () {
                        this.input.tooltip("close").attr("title", "");
                    }, 2500);
                    this.input.data("ui-autocomplete").term = "";
                },

                _destroy: function () {
                    this.wrapper.remove();
                    this.element.show();
                }
            });
        })(jQuery);

        $(function () {
            $("#combobox").combobox();

            $(".custom-combobox-input").click(function () {
                $(".custom-combobox-input").val("");
            });

        });
    </script>


Third Step : You have create drop down control. The dropdown control should be present inside the div with class 'ui-widget'

<div class="ui-widget">
                <asp:DropDownList ID="combobox" runat="server" ClientIDMode="Static" CssClass="text input">
                </asp:DropDownList>                

 </div> 

In the above code i don't have selectedIndexChanged event for dropdown. There may be 2 scenarios we have here.

Option 1: Select item from drop down, then click the button to get the data. For this case you just copy the above script. This will work drop down with autocomplete functionality

Option 2: Select item from drop down, on selectionIndexchanged there may be some fucntionality to do. For this case you just need to uncomment the code
__doPostBack('<%= combobox.UniqueID %>', ''); in 'autocompleteselect' in jquery. Then write
selectionIndexchanged event for your drop down control.


   <asp:DropDownList ID="combobox" runat="server" ClientIDMode="Static" CssClass="text input" OnSelectedIndexChanged="ddlEmployee_SelectedIndexChanged" AutoPostBack="true">
</asp:DropDownList>





 

Tuesday, March 27, 2012


The Fantastic Flying Books of Mr.Morris Lessmore

If you followed this year Oscar awards you will know that the best animated movie award went to this short film (~15 minutes) “The Fantastic Flying Books of Mr. Morris Lessmore”. I watched this movie today and it was awesome. No dialogs.
The movie starts with a young writer writing his memoir and then getting caught in a bad hurricane. After it ends, he sees a young girl who is flying with books all around her carrying the flight. He then sees a Humpty Dumpty book and follows it to a magical world of books. He then starts managing the magical book library. If you are someone like me who loves books then don’t miss this movie. You can buy it from iTunes store or if you are lucky catch it while it is still in YouTube!
FantasticFlyingBooks