Con la DataView è possibile ordinare (DataView.Sort Property) e filtrare (DataView.RowFilter Property) i dati di una DataTable. Le espressioni di filtro dispongono di alcune funzionalità tipiche del linguaggio SQL come la LIKE che - con alcune limitazioni - filtra campi che iniziano, finiscono o contengono determinati valori. Ovviamente l'espressione è soggetta a specifiche legate ad alcuni caratteri speciali - di uso raro - che se ci dimentichiamo di gestire ci possono fare inciampare in eccezioni poco gradite.
Non è sufficiente una semplice replace data la natura dei caratteri speciali e le modalità di escape necessarie. Ecco come ho risolto il problema con l'aiuto delle potenzialità delle Regular Expression e del MatchEvaluator, delegate che permette di avere maggiore controllo nelle logiche di replace a fronte di match.
| class DataViewHelper { static string OnLikeEscapeEvaluate(Match match) { switch (match.Value) { case "%": return "[%]"; case "*": return "[*]"; case "[": return "[[]"; case "]": return "[]]"; case "'": return "''"; default: return match.Value; } } public static string LikeEscape(string value) { return Regex.Replace(value, "['%*\\[\\]]", new MatchEvaluator(OnLikeEscapeEvaluate)); } } |
Seguono esempi di utilizzo della classe.
| //Filtro per campo "City" che inizia per "Mi" myDataView.RowFilter = string.format("City LIKE '{0}%'", DataViewHelper.LikeEscape("Mi")) //Filtro per campo "City" che contiene "d'Adda" myDataView.RowFilter = string.format("City LIKE '%{0}%'", DataViewHelper.LikeEscape("d'Adda")) |
Per maggiori informazioni sulla sintassi usabile nei filtri, su caratteri speciali e relative logiche di escape rimando alla documentazione di msdn "DataColumn.Expression Property".