Click here to Skip to main content
15,881,248 members
Articles / Desktop Programming / Windows Forms

i00 Spell Check and Control Extensions - No Third Party Components Required!

Rate me:
Please Sign up or sign in to vote.
4.95/5 (117 votes)
11 Jan 2014Ms-PL16 min read 1.3M   21   266  
Simple to use, open source Spell Checker for .NET
'©i00 Productions All rights reserved
'This article is derived from http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/43069cef-9f0a-4854-a5e7-42b701abc75e/
'----------------------------------------------------------------------------------------------------
'
'i00 is not and shall not be held accountable for any damages directly or indirectly caused by the
'use or miss-use of this product.  This product is only a component and thus is intended to be used 
'as part of other software, it is not a complete software package, thus i00 Productions is not 
'responsible for any legal ramifications that software using this product breaches.

Imports System.Reflection
Imports System.ComponentModel

<System.ComponentModel.DesignerCategory("")> _
Public Class PropertyComparer(Of T)
    Inherits System.Collections.Generic.Comparer(Of T)
    ' The following code contains code implemented by Rockford Lhotka:
    ' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadvnet/html/vbnet01272004.asp
    ' The following code was then converted into VB from Michael Weinhardt's C# implementation at:
    ' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnforms/html/winforms02182005.asp
    Private _property As PropertyDescriptor
    Private _direction As ListSortDirection
    Public Sub New(ByVal [property] As PropertyDescriptor, ByVal direction As ListSortDirection)
        _property = [property]
        _direction = direction
    End Sub
#Region "IComparer<T>"
    Public Overrides Function Compare(ByVal xWord As T, ByVal yWord As T) As Integer
        ' Get property values
        Dim xValue As Object = GetPropertyValue(xWord, _property.Name)
        Dim yValue As Object = GetPropertyValue(yWord, _property.Name)
        ' Determine sort order
        If _direction = ListSortDirection.Ascending Then
            Return CompareAscending(xValue, yValue)
        Else
            Return CompareDescending(xValue, yValue)
        End If
    End Function
    Public Overloads Function Equals(ByVal xWord As T, ByVal yWord As T) As Boolean
        Return xWord.Equals(yWord)
    End Function
    Public Overloads Function GetHashCode(ByVal obj As T) As Integer
        Return obj.GetHashCode()
    End Function
#End Region
    ' Compare two property values of any type
    Private Function CompareAscending(ByVal xValue As Object, ByVal yValue As Object) As Integer
        Dim result As Integer
        ' If values implement IComparer
        If TypeOf xValue Is IComparable Then
            result = (DirectCast(xValue, IComparable)).CompareTo(yValue)
        Else
            If xValue Is Nothing Then
                If yValue Is Nothing Then
                    result = 0
                Else
                    result = -1
                End If
            ElseIf xValue.Equals(yValue) Then
                ' If values don't implement IComparer but are equivalent
                result = 0
            Else
                result = xValue.ToString().CompareTo(yValue.ToString())
            End If
            ' Values don't implement IComparer and are not equivalent, so compare as string values
        End If
        ' Return result
        Return result
    End Function
    Private Function CompareDescending(ByVal xValue As Object, ByVal yValue As Object) As Integer
        ' Return result adjusted for ascending or descending sort order ie
        ' multiplied by 1 for ascending or -1 for descending
        Return CompareAscending(xValue, yValue) * -1
    End Function
    Private Function GetPropertyValue(ByVal value As T, ByVal [property] As String) As Object
        ' Get property
        Dim propertyInfo As PropertyInfo = value.[GetType]().GetProperty([property])
        ' Return value
        Return propertyInfo.GetValue(value, Nothing)
    End Function
End Class

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


Written By
i00
Software Developer (Senior) i00 Productions
Australia Australia
I hope you enjoy my code. It's yours to use for free, but if you do wish to say thank you then a donation is always appreciated.
You can donate here.

Comments and Discussions