Telerik UI for WPF?下载30天免费试用

筛选自定义类型

如果要筛选数据绑定到自定义类型的列,则需要确保自定义类型满足某些条件。我们将使用类型举个例子。

例1:Person类

公共类Person{私有只读字符串名称;私人智力;公共字符串名称{获取{返回this.name;}} public int Age {get{返回this.age;}设置{this。年龄=价值;}} public Person(字符串名称){this.name = name;}}
Public Class Person Private ReadOnly m_name As String Private m_age As Integer Public ReadOnly Property Name() As String Get Return Me。m_name结束获取结束属性公共属性年龄()作为整数获取返回我。m_age结束Get Set(value As Integer) Me。m_age = value结束设置结束属性Public Sub New(name As String) Me。m_name = name结束子结束类

您需要做的第一件事是实现泛型IEquatable接口。它只有一个方法=.接下来,您需要重写Object.Equals(对象)而且对象。GetHashCode方法.MSDN声明,如果你实现泛型IEquatable,你还必须重写Object. equals (Object)和Object的基类实现。GetHashCode使它们的行为与一般的IEquatable的行为一致。=方法。

实现IEquatable

例2:IEquatable实现

公共类Person: IEquatable{私有只读字符串名称;私人智力;公共字符串名称{获取{返回this.name;}} public int Age {get{返回this.age;}设置{this。年龄=价值;}} public Person(字符串名称){this.name = name;} bool IEquatable。=(Person other) { if (other == null) { return false; } return StringComparer.Ordinal.Equals(this.Name, other.Name); } }
Public Class Person实现IEquatable(Of Person) Private ReadOnly m_name作为字符串Private m_age作为整数Public ReadOnly Property Name()作为字符串Get Return Me。m_name结束获取结束属性公共属性年龄()作为整数获取返回我。m_age结束Get Set(value As Integer) Me。m_age = value结束设置结束属性Public Sub New(name As String) Me。m_name = name结束子公共函数GenericEquals(other As Person) As Boolean实现IEquatable(Of Person)。[Equals]如果other为空则返回False结束如果返回StringComparer.Ordinal.Equals(Me。Name, other.Name)结束函数结束类

重写Object. equals (Object)和Object。GetHashCode方法

如果你重写了Object.Equals(Object),你重写的实现也会在调用静态Equals(System. Equals)时被调用。Object, System.Object)方法。这确保Equals方法的所有调用都返回一致的结果。此外,当需要发现不同的值时,框架将使用GetHashCode方法。

例3:Equals和GetHashCode重写

public override bool等于(对象obj){返回((IEquatable)this)。Equals(obj as Person);}公共覆盖int GetHashCode(){返回this.Name.GetHashCode() ^ this.Age.GetHashCode();}
Public override Function Equals(obj As Object)作为Boolean返回DirectCast(Me, IEquatable(Of Person))。=(TryCast(obj, Person)) End Function Public Overrides Function GetHashCode() As Integer Return Me.Name.GetHashCode() Xor Me.Age.GetHashCode() End Function

覆盖ToString

接下来,您需要重写ToString方法,以便不同的值和网格单元格以友好的方式显示您的类。下面是这个类的样子:

例4:ToString覆盖

ToString(){返回this.Name;}
公共覆盖函数ToString()作为字符串返回我。名称结束

为字符串转换定义一个TypeConverter

接下来需要定义一个TypeConverter用于字符串转换。当RadGridView遇到一个自定义类型时,它将使用一个纯文本框作为字段筛选编辑器。用户输入的字符串必须转换为您的自定义类型,反之亦然。这可以通过在类上指定TypeConverter来实现。

例5:自定义TypeConverter

公共类PersonConverter: System.ComponentModel. typeconverter {public override bool CanConvertFrom(System.ComponentModel. typeconverter)ITypeDescriptorContext context, Type sourceType) {if (sourceType == typeof(string)){返回true;}返回基地。CanConvertFrom(上下文,sourceType);}公共覆盖对象ConvertFrom(System.ComponentModel. com)ITypeDescriptorContext context, System.Globalization.CultureInfo文化,对象值){var stringValue =值作为字符串;if (stringValue != null){返回new Person(stringValue);}返回基地。ConvertFrom(上下文,文化,价值);} public override bool CanConvertTo(System.ComponentModel. CanConvertTo)。ITypeDescriptorContext context,类型destinationType) {if (destinationType == typeof(string)){返回true; } return base.CanConvertTo(context, destinationType); } public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { return ((Person)value).ToString(); } return base.ConvertTo(context, culture, value, destinationType); } }
公共类PersonConverter继承System.ComponentModel. typeconverter公共覆盖函数CanConvertFrom(context为System.ComponentModel. typeconverter)。ITypeDescriptorContext, sourceType As Type) As Boolean如果sourceType = GetType(String)则返回True结束CanConvertFrom(context, sourceType)结束函数Public override函数ConvertFrom(context As System.ComponentModel. system)ITypeDescriptorContext, culture As System.Globalization。CultureInfo, value As Object) As Object Dim stringValue = TryCast(value, String)如果stringValue不是什么,则返回New Person(stringValue)结束如果返回MyBase. value,则返回String对象。CanConvertTo(context As System.ComponentModel. value)ITypeDescriptorContext, destinationType As Type) As Boolean如果destinationType = GetType(String)则返回True结束CanConvertTo(context, destinationType)结束函数Public override函数ConvertTo(context As System.ComponentModel. context)ITypeDescriptorContext, culture As System.Globalization。CultureInfo, value As Object, destinationType As Type) As Object如果destinationType = GetType(String)则返回DirectCast(value, Person). tostring()结束如果返回MyBase。ConvertTo(context, culture, value, destinationType)结束函数结束类

别忘了加上TypeConverter属性,并将其指向您刚刚创建的自定义TypeConverter。

例6:添加TypeConverter属性

[typeeconverter (typeof(PersonConverter))]公共类Person: IEquatable{//…}
公共类Person实现IEquatable(Of Person)“…结束课

属性,从而提供自己的字段筛选编辑器GridViewDataColumn。CreateFieldFilterEditor方法,如所述在这里.如果您的自定义字段筛选器能够生成自定义类型的实例,那么您将不再需要TypeConverter。

重写比较操作符(可选)

如果您想查看比较筛选操作符(小于,等等),你应该重写自定义类型的比较操作符。

例7:比较运算符重写

public static bool操作符<(Person left, Person right){返回左。年龄<右。年龄;}公共静态bool操作符<=(Person left, Person right){返回左。年龄<= right.年龄;}公共静态bool操作符>(Person left, Person right){返回左。年龄>对。}公共静态bool操作符>=(Person left, Person right){返回左。年龄>= right.年龄;}
公共共享操作符<(left As Person, right As Person) As Boolean向左返回。年龄<正确。年龄结束运算符公共共享运算符<=(左As Person,右As Person) As Boolean返回左。年龄<=正确。年龄结束运算符公共共享运算符>(左As Person,右As Person) As Boolean向左返回。年龄>对。年龄结束运算符公共共享运算符>=(左As Person,右As Person) As Boolean向左返回。年龄>= right。年龄结束

另请参阅

在本文中
Baidu
map