DevExpress WPF使用教程:為Search Panel使用自定義過濾器
DevExpress廣泛應(yīng)用于ECM企業(yè)內(nèi)容管理、 成本管控、進程監(jiān)督、生產(chǎn)調(diào)度,在企業(yè)/政務(wù)信息化管理中占據(jù)一席重要之地。通過DevExpress WPF Controls,您能創(chuàng)建有著強大互動功能的XAML基礎(chǔ)應(yīng)用程序,這些應(yīng)用程序?qū)W⒂诋?dāng)代客戶的需求和構(gòu)建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件的衍伸產(chǎn)品,還是以數(shù)據(jù)為中心的商業(yè)智能產(chǎn)品,都能通過該控件來實現(xiàn)。
DevExpress WPF Controls v19.2下載
問題:
項目中實現(xiàn)了customRowFilter(下面提供的代碼),以便在用戶搜索網(wǎng)格時忽略重音和大小寫。目前存在的問題是,如果用戶使用filter editor應(yīng)用于列表,然后使用綁定到TableView.SearchString的搜索框。如何在FilterString和SearchString之間使用AND,現(xiàn)在似乎是OR。如何在這兩個條件之間實現(xiàn)使用AND而不是OR?
private List<GridColumn> _searchableColumns; private void OnCustomRowFilter(object sender, RowFilterEventArgs e) { if (string.IsNullOrEmpty(View.SearchString) || e.Handled) return; if (_searchableColumns == null) { _searchableColumns = new List<GridColumn>(); foreach (var c in Columns) { if (c.FieldType == typeof(bool) || !c.AllowAutoFilter) continue; _searchableColumns.Add(c); } } var filter = RemoveDiacriticsCustom(View.SearchString).ToLower(); e.Visible = false; for (var i = 0; i < _searchableColumns.Count; i++) { var processedString = RemoveDiacriticsCustom(GetCellDisplayTextByListIndex(e.ListSourceRowIndex, _searchableColumns[i])).ToLower(); if (processedString.Contains(filter)) { e.Visible = true; break; } } e.Handled = true; } private static string RemoveDiacriticsCustom(string text) { return string.Concat(text.Normalize(NormalizationForm.FormD).Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) != UnicodeCategory.NonSpacingMark)).Normalize(NormalizationForm.FormC); }
分析了DevExpress Searching/Filtering pipeline,發(fā)現(xiàn)可以修改以下方法實現(xiàn)搜索和忽略重音。在不修改DevExpress代碼的情況下,有一種方法可以實現(xiàn)使用以下修改后代碼的earchStringToFilterCriteria自定義函數(shù)。
static bool? FnContainsCaseInsensitive(string str1, string str2) { if(str1 == null || str2 == null) return null; //return //str1.IndexOf(str2, StringComparison.InvariantCultureIgnoreCase) >= 0 || //str1.IndexOfInvariantCultureIgnoreCase(str2) >= 0; var compareInfo = CultureInfo.InvariantCulture.CompareInfo; return compareInfo.IndexOf(str1, str2, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace) > -1; }
解決方案:
CustomRowFilter旨在覆蓋默認過濾的結(jié)果,因此需要考慮FilterString屬性值,或者使用其他事件。
建議考慮改用SearchStringToFilterCriteria事件,可以在其中指定如何將搜索字符串轉(zhuǎn)換為過濾條件。例如創(chuàng)建一個自定義函數(shù)標(biāo)準(zhǔn)運算符,該運算符將刪除變音符號并在SearchStringToFilterCriteria事件處理程序中使用它。
DevExpress v19.2全新發(fā)布,最新動態(tài)請持續(xù)關(guān)注DevExpress中文網(wǎng)!
DevExpress中文網(wǎng)官網(wǎng)QQ群:540330292 歡迎一起進群討論
DevExpress 2019年度界面大賽火熱開啟!曬圖有獎,各大視頻VIP免費領(lǐng)?。?/strong>
掃描下方二維碼,立即參與哦!