Is it possible to highlight the matches in the results of RadSearchBox?
Many thanks,
Martin
3 Answers, 1 is accepted
Currently such scenario is not supported by RadSearchBox. Please excuse us for this limitation of our control.
Plamen
Telerik
I know this post is very old, but just had to do this, so if anyone is looking, this is what I did, using web service binding
<div id="topSearchBox" class="searchContainer">
<telerik:RadSearchBox RenderMode="Lightweight" ID="TopRadSearchBox" runat="server"
EmptyMessage="<%$ Resources:Common, SEARCH_DEVICES %>"
MaxResultCount="20" MinFilterLength="2"
OnSearch="TopRadSearchBox_Search">
<DropDownSettings Width="100%">
<HeaderTemplate>
<ul>
<li class="col1"><asp:Literal runat="server" Text="<%$ Resources:Common, IP_ADDRESS%>" /></li>
<li class="col2"><asp:Literal runat="server" Text="<%$ Resources:Common, MAC_ADDRESS%>" /></li>
<li class="col3"><asp:Literal runat="server" Text="<%$ Resources:Common, SERIAL_NUMBER%>" /></li>
<li class="col4"><asp:Literal runat="server" Text="<%$ Resources:Common, LOCATION%>" /></li>
<li class="col5"><asp:Literal runat="server" Text="<%$ Resources:Common, ASSET_NUMBER%>" /></li>
<li class="col6"><%= Device_CustomField_1_Name %></li>
<li class="col7"><%= Device_CustomField_2_Name %></li>
</ul>
</HeaderTemplate>
<ClientTemplate>
<ul>
<li class="col1">#= DataItem.IPAddress #</li>
<li class="col2">#= DataItem.MacAddress #</li>
<li class="col3">#= DataItem.SerialNumber #</li>
<li class="col4">#= DataItem.Location #</li>
<li class="col5">#= DataItem.AssetNumber #</li>
<li class="col6">#= DataItem.Device_CustomField_1 #</li>
<li class="col7">#= DataItem.Device_CustomField_2 #</li>
</ul>
</ClientTemplate>
</DropDownSettings>
<WebServiceSettings Method="GetSearchItems" Path="SupplyGridData.asmx" />
</telerik:RadSearchBox>
code in asmx file
public SearchBoxData GetSearchItems(SearchBoxContext context)
{
try
{
UserWithFullDetails userWithFullDetails = (UserWithFullDetails)Session["User"];
List<SearchBoxItemData> items = new List<SearchBoxItemData>();
//get list of search result objects
List<DeviceSearchResult> deviceSearchResults = DeviceSearchResult.GetDeviceRearchResults(context.Text, userWithFullDetails);
foreach (DeviceSearchResult deviceSearchResult in deviceSearchResults)
{
SearchBoxItemData searchBoxItemData = new SearchBoxItemData();
//convert results to dictionary object
Dictionary<String, object> searchResultsProperties = deviceSearchResult.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).ToDictionary(prop => prop.Name, prop => prop.GetValue(deviceSearchResult, null));
//check each property
foreach (KeyValuePair<String, object> searchResultsProperty in searchResultsProperties)
{
//if
if (searchResultsProperty.Value != null)
{
// if not null, see if it contains the search text, and if it does, insert the <mark> tag around text
// we do this instead of replace, as that is case sensitive
Int32 searchlen = context.Text.Length, foundIndex = 0;
String highlightedValue = searchResultsProperty.Value.ToString();
foundIndex = highlightedValue.IndexOf(context.Text, StringComparison.OrdinalIgnoreCase);
while (foundIndex > -1)
{
highlightedValue = highlightedValue.Insert(foundIndex, "<mark>");
foundIndex += 6 + searchlen;
highlightedValue = highlightedValue.Insert(foundIndex, "</mark>");
foundIndex += 7;
foundIndex = highlightedValue.IndexOf(context.Text, foundIndex, StringComparison.OrdinalIgnoreCase);
}
searchBoxItemData.DataItem.Add(searchResultsProperty.Key, highlightedValue);
}
else
searchBoxItemData.DataItem.Add(searchResultsProperty.Key, "");
}
searchBoxItemData.Value = deviceSearchResult.DeviceID.ToString();
items.Add(searchBoxItemData);
}
SearchBoxData result = new SearchBoxData();
result.Items = items.ToArray();
return result;
}
catch (Exception err)
{
Util.ErrorLog("SupplyGridData:GetSearchItems - " + err.ToString());
return null;
}
}
Hello Bryan,
Thank you for sharing your solution with the community.
I would like to add another approach people might consider useful, based on the RegEx highlighting logic in the following KB article:
<telerik:RadSearchBox RenderMode="Lightweight" ID="RadSearchBox1" Filter="Contains" runat="server" Width="300" EmptyMessage="Search Continents">
<DropDownSettings Height="150" Width="250" />
</telerik:RadSearchBox>
<style>
.highlight {
background: yellow;
}
</style>
<script>
// https://www.telerik.com/support/kb/aspnet-ajax/details/highlight-text-inside-html-elements-and-templates
function escapeRegExp(str) {
//https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function highlightText(text, originalHtml) {
var newHtml;
newHtml = originalHtml.replace(new RegExp(escapeRegExp(text), "gi"), function replace(match) {
return '<span class="highlight">' + match + '</span>';
})
return newHtml;
}
Telerik.Web.UI.RadSearchBox.prototype.original_populateDropDown = Telerik.Web.UI.RadSearchBox.prototype._populateDropDown;
Telerik.Web.UI.RadSearchBox.prototype._populateDropDown = function ($elements, renderShowAllButton) {
var searchbox = this;
var searchText = searchbox.get_text();
$elements.each(function () {
var liElement = this;
liElement.innerHTML = highlightText(searchText, liElement.innerHTML);
});
this.original_populateDropDown($elements, renderShowAllButton);
}
</script>
protected void Page_Load(object sender, EventArgs e)
{
RadSearchBox1.DataSource = new List<string>() { "Europe", "America", "Asia", "Africa", "Australia" };
}
Regards,
Peter Milchev
Progress Telerik