2016-11-13 4 views
1

コンポジットフィルタ(複数のフィルタ条件)でオブジェクトリストビューをフィルタリングしようとしていますが、デフォルトのハイライトテキストレンダラは最初のフィルタのテキストのみをレンダリングします。オブジェクト一覧表示コンポジットフィルタを使用したハイライトレンダラー

すべてのフィルタに適用する方法や、複数のテキストレンダラをフィルタごとに使用する方法がありますか?

私はいくつかのC & Pコードは、このソリューションは、私の作品

public void Filter (string txt, MatchKind matchKind) { 
    bool filterByAll; 
    IEnumerable<string> terms = SplitSearchTerms(txt, out filterByAll); 
    List<IModelFilter> modelFilters = new List<IModelFilter>(); 
    foreach (string term in terms) { 
     IModelFilter filter; 
     switch (matchKind) { 
       case MatchKind.Contains: 
       default: 
       filter = TextMatchFilter.Contains(_olv, term); 
       break; 
       case MatchKind.Prefix: 
       filter = TextMatchFilter.Prefix(_olv, term); 
       break; 
       case MatchKind.Regex: 
       filter = TextMatchFilter.Regex(_olv, term); 
       break; 
      } 
     modelFilters.Add(filter); 
    } 

    CompositeFilter compositeFilter; 
    if (filterByAll) { 
     compositeFilter = new CompositeAllFilter(modelFilters); 
    } else { 
     compositeFilter = new CompositeAnyFilter(modelFilters); 
    } 
    //Only highlights text from the first filter 
    HighlightTextRenderer renderer = _olv.DefaultRenderer as HighlightTextRenderer; 
    if (renderer != null) { 
     SolidBrush brush = renderer.FillBrush as SolidBrush ?? new SolidBrush(Color.Transparent); 
     if (brush.Color != Color.LightSeaGreen) { 
      brush.Color = Color.LightSeaGreen; 
      renderer.FillBrush = brush; 
      _olv.DefaultRenderer = renderer; 
     } 
    } else { 
     MessageBox.Show(@"Renderer is null!"); 
    } 
    _olv.ModelFilter = compositeFilter; 
    } 
+0

私は同じ問題があります。解決策を見つけることはどんな運がありますか?かなり古い投稿です、私は知っています:) – Michael

+0

残念なことに:( – Michael

答えて

1

を説明するために、検索語

を区切るために制御文字(& &とを||)を使用しています。複数の列は、ハイライト表示をサポートしています。

var filters = new List<IModelFilter>(); 
TextMatchFilter highlightingFilter = null; 
if (!String.IsNullOrEmpty(txtSearch.Text)) 
{ 
    var words = txtSearch.Text.Trim().Split(null); 
    highlightingFilter = TextMatchFilter.Contains(ListView, words); 
    foreach (var word in words) 
    { 
     var filter = TextMatchFilter.Contains(ListView, word); 
     filters.Add(filter); 
    } 
} 
var compositeFilter = new CompositeAllFilter(filters); 

ListView.ModelFilter = highlightingFilter; 
ListView.AdditionalFilter = compositeFilter; 
ListView.DefaultRenderer = new HighlightTextRenderer(highlightingFilter); 
+0

ありがとうございます!DefaultRendererはテキストを強調表示するもので、すべての条件を指定することで、すべてをハイライト表示できます。 ModelFilterとAdditionalFilterの両方を使用する利点は、その理由を強調することができますか? – Michael

+0

正直言って、私はこれがなぜ機能するのか分かりませんが、私にとってはそれがあります:) – Michael

関連する問題