protected virtual void HandleSearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
{
// The event has e.IsPrefixSearch, but as far as I can tell, this is always false (maybe that's different under Vista)
// So we ignore IsPrefixSearch and IsTextSearch and always to a case insensitve prefix match.
// We can't do anything if we don't have a data source
if (this.VirtualListDataSource == null)
return;
// Where should we start searching? If the last row is focused, the SearchForVirtualItemEvent starts searching
// from the next row, which is actually an invalidate index -- so we make sure we never go past the last object.
int start = Math.Min(e.StartIndex, this.VirtualListDataSource.GetObjectCount() - 1);
// Give the world a chance to fiddle with or completely avoid the searching process
BeforeSearchingEventArgs args = new BeforeSearchingEventArgs(e.Text, start);
this.OnBeforeSearching(args);
if (args.Canceled)
return;
// Do the search
int i = this.FindMatchingRow(args.StringToFind, args.StartSearchFrom, e.Direction);
// Tell the world that a search has occurred
AfterSearchingEventArgs args2 = new AfterSearchingEventArgs(args.StringToFind, i);
this.OnAfterSearching(args2);
// If we found a match, tell the event
if (i != -1)
e.Index = i;
}