TextBox With Suggestions in SharePoint

This control will suggest values for a text box from the values in a SharePoint list. It makes use of the HTML5 datalist element in a slightly customized TextBox control.

   1: public class SPTextBox : TextBox
   2: {
   3:     public SPTextBox()
   4:     {
   5:         this.FieldName = "Title";
   6:     }
   7:  
   8:     [Description("List name")]
   9:     [DefaultValue("")]
  10:     public String ListName
  11:     {
  12:         get;
  13:         set;
  14:     }
  15:  
  16:     [Description("Field name")]
  17:     [DefaultValue("Title")]
  18:     public String FieldName
  19:     {
  20:         get;
  21:         set;
  22:     }
  23:  
  24:     protected override void Render(HtmlTextWriter writer)
  25:     {
  26:         var addList = (this.Visible == true) && (String.IsNullOrWhiteSpace(this.ListName) == false) && (String.IsNullOrWhiteSpace(this.FieldName) == false);
  27:         var dataId = String.Concat(this.ID, "_data");
  28:  
  29:         if (addList == true)
  30:         {
  31:             this.Attributes["list"] = dataId;
  32:         }
  33:  
  34:         base.Render(writer);
  35:  
  36:         if (addList == true)
  37:         {
  38:             var list = SPContext.Current.Web.Lists[this.ListName];
  39:             var values = list.Items.OfType<SPListItem>().Select(x => x[this.FieldName]).Distinct().OrderBy(x => x.ToString());
  40:  
  41:             writer.WriteLine(String.Format("<datalist id=\"{0}\">", dataId));
  42:  
  43:             foreach (var value in values)
  44:             {
  45:                 writer.WriteLine(String.Format("<option value=\"{0}\"/>", value));
  46:             }
  47:  
  48:             writer.WriteLine("</datalist>");
  49:         }
  50:     }
  51: }

Before you ask, yes, I know about GetDistinctFieldValues, but it is marked as deprecated, which means it may go away in a future version of SharePoint and besides it can’t get distinct values for all fields – Title, for instance.

You declare it as a regular TextBox, plus a ListName and a FieldName properties:

   1: <my:SPTextBox runat="server" ID="something" ListName="Tasks" FieldName="Title"/>

And when it runs, it will present something like this:

image

                             

1 Comment

Add a Comment

As it will appear on the website

Not displayed

Your website