C# 使用Telerik RadGridView进行不区分大小写和变音标记的过滤

C# 使用Telerik RadGridView进行不区分大小写和变音标记的过滤,c#,winforms,visual-studio-2015,telerik-grid,C#,Winforms,Visual Studio 2015,Telerik Grid,标题几乎说明了一切。如何使用Telerik RadGridView实现不区分大小写和区分关键标记的过滤 我在谷歌上找到了许多可行的解决方案,但没有一个是简单易用的,而且在很多情况下,它改变了RadGridView的UI行为,使其对最终用户的吸引力降低。多年来,我的经验和技能都在增长,所以我最终想出了一个简单易用的解决方案。它与Telerik UI for WinForms 2017 R1或更新版本以及Visual Studio 2015或更新版本配合使用 以下是帮助器类,RadGridViewH

标题几乎说明了一切。如何使用Telerik RadGridView实现不区分大小写和区分关键标记的过滤


我在谷歌上找到了许多可行的解决方案,但没有一个是简单易用的,而且在很多情况下,它改变了RadGridView的UI行为,使其对最终用户的吸引力降低。

多年来,我的经验和技能都在增长,所以我最终想出了一个简单易用的解决方案。它与Telerik UI for WinForms 2017 R1或更新版本以及Visual Studio 2015或更新版本配合使用

以下是帮助器类,
RadGridViewHelper

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI;

namespace MySoftware.Helpers
{
    internal static class RadGridViewHelper
    {
        private class CustomStringFilteringClass
        {
            private RadGridView RadGridView { get; }
            private bool _enabled;
            private ReadOnlyCollection<string> StringColumns { get; }

            public CustomStringFilteringClass(RadGridView radGridView)
            {
                RadGridView = radGridView;
                StringColumns = new ReadOnlyCollection<string>(GetStringColumns(radGridView));
            }

            public void Enable()
            {
                if (_enabled) throw new InvalidOperationException("Can't call this method twice");
                _enabled = true;

                RadGridView.EnableCustomFiltering = true;
                RadGridView.CustomFiltering += RadGridViewOnCustomFiltering;
            }

            private void RadGridViewOnCustomFiltering(object sender, GridViewCustomFilteringEventArgs e)
            {
                if (RadGridView.FilterDescriptors.Count == 0) return;

                var row = e.Row;

                foreach (var stringColumn in StringColumns)
                {
                    var filterDescriptors = RadGridView.FilterDescriptors.Where(
                        x => x.PropertyName == stringColumn).ToList();
                    if (filterDescriptors.Count != 1)
                    {
                        continue;
                    }
                    var filterDescriptor = filterDescriptors.First();
                    var cellValue = ((string) row.Cells[stringColumn].Value).ToLowerInvariant();
                    if (filterDescriptor.GetType() == typeof(CompositeFilterDescriptor))
                    {
                        if (!CompositeFilterEvaluateString((CompositeFilterDescriptor) filterDescriptor, cellValue,
                            RadGridView.MasterTemplate.DataView.FilterEvaluate, row))
                        {
                            e.Visible = false;
                            return;
                        }
                    }
                    else if (!FilterEvaluateString(filterDescriptor, cellValue,
                        RadGridView.MasterTemplate.DataView.FilterEvaluate, row))
                    {
                        e.Visible = false;
                        return;
                    }
                }

                var nonStringFilterDescriptors = RadGridView.FilterDescriptors.Where(
                    x => !StringColumns.Contains(x.PropertyName));
                foreach (var filterDescriptor in nonStringFilterDescriptors)
                {
                    if (!RadGridView.MasterTemplate.DataView.FilterEvaluate(filterDescriptor, row))
                    {
                        e.Visible = false;
                        return;
                    }
                }
            }

            private static bool CompositeFilterEvaluateString(CompositeFilterDescriptor compositeFilterDescriptor,
                string cellValue, Func<FilterDescriptor, GridViewRowInfo, bool> gridFilterEvaluate, GridViewRowInfo row)
            {
                switch (compositeFilterDescriptor.LogicalOperator)
                {
                    case FilterLogicalOperator.And:
                        if (compositeFilterDescriptor.FilterDescriptors.Any(filterDescriptor =>
                        {
                            if (filterDescriptor.GetType() == typeof(CompositeFilterDescriptor))
                                return !CompositeFilterEvaluateString((CompositeFilterDescriptor) filterDescriptor,
                                    cellValue, gridFilterEvaluate, row);
                            return !FilterEvaluateString(filterDescriptor, cellValue, gridFilterEvaluate, row);
                        }))
                            return false;
                        break;
                    case FilterLogicalOperator.Or:
                        if (compositeFilterDescriptor.FilterDescriptors.All(filterDescriptor =>
                        {
                            if (filterDescriptor.GetType() == typeof(CompositeFilterDescriptor))
                                return !CompositeFilterEvaluateString((CompositeFilterDescriptor) filterDescriptor,
                                    cellValue, gridFilterEvaluate, row);
                            return !FilterEvaluateString(filterDescriptor, cellValue, gridFilterEvaluate, row);
                        }))
                            return false;
                        break;
                }
                return true;
            }

            private static bool FilterEvaluateString(FilterDescriptor filterDescriptor, string cellValue,
                Func<FilterDescriptor, GridViewRowInfo, bool> gridFilterEvaluate, GridViewRowInfo row)
            {
                var filterDescriptorValue = ((string) filterDescriptor.Value).ToLowerInvariant();
                switch (filterDescriptor.Operator)
                {
                    case FilterOperator.Contains:
                        if (CultureInfo.InvariantCulture.CompareInfo.IndexOf(cellValue, filterDescriptorValue,
                                CompareOptions.IgnoreNonSpace) == -1)
                            return false;
                        break;
                    case FilterOperator.NotContains:
                        if (CultureInfo.InvariantCulture.CompareInfo.IndexOf(cellValue, filterDescriptorValue,
                                CompareOptions.IgnoreNonSpace) != -1)
                            return false;
                        break;
                    case FilterOperator.StartsWith:
                        if (!CultureInfo.InvariantCulture.CompareInfo.IsPrefix(cellValue, filterDescriptorValue,
                            CompareOptions.IgnoreNonSpace))
                            return false;
                        break;
                    case FilterOperator.EndsWith:
                        if (!CultureInfo.InvariantCulture.CompareInfo.IsSuffix(cellValue, filterDescriptorValue,
                            CompareOptions.IgnoreNonSpace))
                            return false;
                        break;
                    case FilterOperator.IsEqualTo:
                        if (String.Compare(cellValue, filterDescriptorValue, CultureInfo.InvariantCulture,
                                CompareOptions.IgnoreNonSpace) != 0)
                            return false;
                        break;
                    case FilterOperator.IsNotEqualTo:
                        if (String.Compare(cellValue, filterDescriptorValue, CultureInfo.InvariantCulture,
                                CompareOptions.IgnoreNonSpace) == 0)
                            return false;
                        break;
                    default:
                        if (!gridFilterEvaluate.Invoke(filterDescriptor, row))
                            return false;
                        break;
                }
                return true;
            }
        }

        private static List<string> GetStringColumns(RadGridView radGridView)
        {
            var retVal = new List<string>();
            foreach (var column in radGridView.Columns)
            {
                if (column.DataType == typeof(string))
                {
                    retVal.Add(column.Name);
                }
            }
            return retVal;
        }

        /// <summary>
        /// Enables custom string filtering on <paramref name="radGridView"/>. It is case insensitive and
        /// tolerates differences in diacritical marks. For example, in a "equals" comparision, the value
        /// 'ëMúa' is treated as its equal to 'EmÜâ'.
        /// </summary>
        /// <param name="radGridView">Instance of <see cref="RadGridView"/> in which custom string filtering
        /// will be enabled.</param>
        public static void CustomStringFiltering(RadGridView radGridView)
        {
            var customFiltering = new CustomStringFilteringClass(radGridView);
            customFiltering.Enable();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
利用制度全球化;
使用System.Linq;
使用Telerik.WinControl.Data;
使用Telerik.WinControls.UI;
命名空间MySoftware.Helpers
{
内部静态类RadGridViewHelper
{
私有类CustomStringFilteringClass
{
私有RadGridView RadGridView{get;}
启用私有布尔;
私有只读集合StringColumns{get;}
公共CustomStringFilteringClass(RadGridView RadGridView)
{
RadGridView=RadGridView;
StringColumns=new ReadOnlyCollection(GetStringColumns(radGridView));
}
公共作废启用()
{
如果(_enabled)抛出新的InvalidOperationException(“无法调用此方法两次”);
_启用=真;
RadGridView.EnableCustomFiltering=true;
RadGridView.CustomFiltering+=RadGridViewOnCustomFiltering;
}
私有void RadGridViewOnCustomFiltering(对象发送方,GridViewCustomFilteringEventArgs e)
{
if(RadGridView.FilterDescriptors.Count==0)返回;
var行=e行;
foreach(StringColumns中的var stringColumn)
{
var filterDescriptors=RadGridView.filterDescriptors.Where(
x=>x.PropertyName==stringColumn.ToList();
if(filterDescriptors.Count!=1)
{
继续;
}
var filterDescriptor=filterDescriptors.First();
var cellValue=((字符串)行.Cells[stringColumn].Value).ToLowerInvariant();
if(filterDescriptor.GetType()==typeof(CompositeFilterDescriptor))
{
如果(!CompositeFilterEvaluateTestRing((CompositeFilterDescriptor)filterDescriptor,cellValue,
RadGridView.MasterTemplate.DataView.FilterEvaluate,第行)
{
e、 可见=假;
返回;
}
}
否则如果(!FilterEvaluationEstring)(filterDescriptor,cellValue,
RadGridView.MasterTemplate.DataView.FilterEvaluate,第行)
{
e、 可见=假;
返回;
}
}
var nonStringFilterDescriptors=RadGridView.FilterDescriptors.Where(
x=>!StringColumns.Contains(x.PropertyName));
foreach(非stringFilterDescriptor中的var filterDescriptor)
{
if(!RadGridView.MasterTemplate.DataView.FilterEvaluate(filterDescriptor,第行))
{
e、 可见=假;
返回;
}
}
}
专用静态布尔CompositeFilterEvaluateTestRing(CompositeFilterDescriptor CompositeFilterDescriptor,
字符串cellValue,Func gridFilterEvaluate,GridViewRowInfo行)
{
开关(compositeFilterDescriptor.LogicalOperator)
{
案例过滤器逻辑运算符。和:
if(compositeFilterDescriptor.FilterDescriptors.Any)(filterDescriptor=>
{
if(filterDescriptor.GetType()==typeof(CompositeFilterDescriptor))
return!CompositeFilterEvaluateTestRing((CompositeFilterDescriptor)filterDescriptor,
单元格值,gridFilterEvaluate,行);
return!FilterEvaluationEstring(filterDescriptor、cellValue、GridFilterEvaluation、row);
}))
返回false;
打破
案例过滤器逻辑运算符。或:
如果(compositeFilterDescriptor.FilterDescriptors.All)(filterDescriptor=>
{
if(filterDescriptor.GetType()==typeof(CompositeFilterDescriptor))
return!CompositeFilterEvaluateTestRing((CompositeFilterDescriptor)filterDescriptor,
单元格值,gridFilterEvaluate,行);
return!FilterEvaluationEstring(filterDescriptor、cellValue、GridFilterEvaluation、row);
}))
返回false;
打破
}
返回true;
}
专用静态布尔筛选器评估字符串(FilterDescriptor FilterDescriptor,字符串cellValue,
Func gridFilterEvaluate,GridViewRowInfo行)
{
var filterDescriptor Value=((字符串)filterDescriptor.Value).ToLowerInvariant();
开关(过滤器描述器操作员)
{
案例过滤器操作器。包含:
if(CultureInfo.InvariantCulture.CompareInfo.IndexOf)(cellValue,filterDescriptorValue,