void TimedFilter(ObjectListView olv, string txt, int matchKind) { TextMatchFilter filter = null; if (!String.IsNullOrEmpty(txt)) { switch (matchKind) { case 0: default: filter = TextMatchFilter.Contains(olv, txt); break; case 1: filter = TextMatchFilter.Prefix(olv, txt); break; case 2: filter = TextMatchFilter.Regex(olv, txt); break; } } // Setup a default renderer to draw the filter matches if (filter == null) { olv.DefaultRenderer = null; } else { olv.DefaultRenderer = new HighlightTextRenderer(filter); // Uncomment this line to see how the GDI+ rendering looks //olv.DefaultRenderer = new HighlightTextRenderer { Filter = filter, UseGdiTextRendering = false }; } // Some lists have renderers already installed HighlightTextRenderer highlightingRenderer = olv.GetColumn(0).Renderer as HighlightTextRenderer; if (highlightingRenderer != null) { highlightingRenderer.Filter = filter; } Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); olv.AdditionalFilter = filter; olv.Invalidate(); stopWatch.Stop(); IList objects = olv.Objects as IList; if (objects == null) { string msg = String.Format("Filtered in {0}ms", stopWatch.ElapsedMilliseconds); this.toolTip1.SetToolTip(this.textBoxFilterTree, msg); } else { string msg = String.Format("Filtered {0} items down to {1} items in {2}ms", objects.Count, olv.Items.Count, stopWatch.ElapsedMilliseconds); this.toolTip1.SetToolTip(this.textBoxFilterTree, msg); } }