Click here to Skip to main content
15,891,849 members
Articles / Programming Languages / XML

Flexible ComboBox and EditingControl

Rate me:
Please Sign up or sign in to vote.
4.80/5 (10 votes)
30 Apr 2012CPOL6 min read 53.9K   5.7K   37  
Using any Control In ComboBox or in EditingControl for DataGridView
' By NewPast.Net

Imports System.Drawing
Imports System.Windows.Forms
Imports System.ComponentModel
Imports System.Drawing.Design
Imports AnyControlComboColumn.ControlConverter
Imports System.Runtime.InteropServices

<ToolboxItem(False)> _
Public Class EditingControl
    Inherits Control
    Implements IDataGridViewEditingControl

    Public Shared Function TranslateAlignment(ByVal align As DataGridViewContentAlignment) As HorizontalAlignment
        Try
            Select Case align
                Case DataGridViewContentAlignment.TopLeft, DataGridViewContentAlignment.MiddleLeft, DataGridViewContentAlignment.BottomLeft
                    Return HorizontalAlignment.Left
                Case DataGridViewContentAlignment.TopCenter, DataGridViewContentAlignment.MiddleCenter, DataGridViewContentAlignment.BottomCenter
                    Return HorizontalAlignment.Center
                Case DataGridViewContentAlignment.TopRight, DataGridViewContentAlignment.MiddleRight, DataGridViewContentAlignment.BottomRight
                    Return HorizontalAlignment.Right
            End Select
            Throw New ArgumentException("Error: Invalid Content Alignment!")
        Catch ex As Exception
            ErrMsg(ex)
            Return Nothing
        End Try
    End Function


    <DefaultValue("")> _
    Public Overrides Property Text() As String
        Get
            Try
                If _Control IsNot Nothing Then
                    Return _Control.Text
                Else
                    Return MyBase.Text
                End If
            Catch ex As Exception
                ErrMsg(ex)
                Return ""
            End Try
        End Get
        Set(ByVal value As String)
            Try
                If value Is Nothing Then value = ""
                If _Control IsNot Nothing AndAlso _Control.Text <> value Then
                    _Control.ResetText()
                    _Control.Text = value
                End If
            Catch ex As Exception
                ErrMsg(ex)
            End Try
        End Set
    End Property

    <DefaultValue("Text")> _
    Public Property ValuePropertyName As String = "Text"

    <DefaultValue("")> _
    Public Property HasValuePropertyName As String = ""

    Protected WithEvents _Control As Control

    <TypeConverter(GetType(ControlConverter))> _
    Public Property Control() As Control
        Get
            Return _Control
        End Get
        Set(ByVal value As Control)
            Try
                Me.Controls.Clear()
                _Control = value
                _Control.Margin = System.Windows.Forms.Padding.Empty
                _Control.Margin = System.Windows.Forms.Padding.Empty
                MyBase.Padding = System.Windows.Forms.Padding.Empty
                MyBase.Margin = System.Windows.Forms.Padding.Empty

                _Control.Dock = DockStyle.Fill
                Me.Controls.Add(_Control)
                _Control.Visible = True

            Catch ex As Exception
                ErrMsg(ex)
            End Try
        End Set
    End Property

    Protected Overrides Sub OnVisibleChanged(ByVal e As System.EventArgs)
        Try
        MyBase.OnVisibleChanged(e)
        If _Control IsNot Nothing Then _Control.Visible = True
        Catch ex As Exception
            ErrMsg(ex)
        End Try
    End Sub

    Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
        Try
            MyBase.OnTextChanged(e)
            EditingControlValueChanged = True
            If Me.EditingControlDataGridView IsNot Nothing Then
                Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
            End If
        Catch ex As Exception
            ErrMsg(ex)
        End Try
    End Sub

    Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As DataGridViewCellStyle) _
    Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
        '
    End Sub

    <Browsable(False), Bindable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Overridable Property EditingControlDataGridView As DataGridView _
    Implements IDataGridViewEditingControl.EditingControlDataGridView

    <Browsable(False), Bindable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Overridable Property EditingControlFormattedValue() As Object _
    Implements IDataGridViewEditingControl.EditingControlFormattedValue
        Get
            Try
                If Not String.IsNullOrEmpty(HasValuePropertyName) Then
                    If Not CBool(PropertyValue(_Control, HasValuePropertyName, True)) Then
                        Return ""
                        Exit Property
                    End If
                End If
                If ValuePropertyName = "Text" Then
                    Return Me.Text

                Else
                    'don't use MPropertyValue.PropertyValue because Converter is needed 
                    Dim Properties = TypeDescriptor.GetProperties(_Control.GetType)
                    Dim Prop = Properties.Find(ValuePropertyName, True)
                    If Prop IsNot Nothing Then
                        Dim v = Prop.GetValue(_Control)
                        If Prop.Converter Is Nothing Then
                            Return v.ToString
                        Else
                            Return Prop.Converter.ConvertTo(v, GetType(String))
                        End If
                    Else
                        Return Nothing
                    End If
                End If
                Return Nothing
            Catch ex As Exception
                ErrMsg(ex)
                Return Nothing
            End Try
        End Get
        Set(ByVal NewFormattedValue As Object)
            Try
                If Not String.IsNullOrEmpty(HasValuePropertyName) Then
                    If NewFormattedValue Is Nothing OrElse TypeOf NewFormattedValue Is DBNull _
                        OrElse (NewFormattedValue.GetType.Name = "Nullable`1" AndAlso NewFormattedValue.ToString = "") Then
                        SetPropertyValue(_Control, HasValuePropertyName, False)
                        Exit Property
                    End If
                End If

                If ValuePropertyName = "Text" Then
                    If NewFormattedValue Is Nothing Then
                        Me.Text = ""
                    Else
                        Me.Text = NewFormattedValue.ToString()

                    End If
                Else
                    'don't use MPropertyValue.PropertyValue because Converter is needed 
                    Dim Properties = TypeDescriptor.GetProperties(_Control.GetType)
                    Dim Prop = Properties.Find(ValuePropertyName, True)
                    If NewFormattedValue IsNot Nothing AndAlso _
                    NewFormattedValue.GetType Is GetType(String) AndAlso Prop.Converter IsNot Nothing Then
                        NewFormattedValue = Prop.Converter.ConvertFrom(NewFormattedValue)
                    End If
                    If Prop IsNot Nothing Then
                        Prop.SetValue(_Control, NewFormattedValue)
                    Else
                        '
                    End If
                End If
            Catch ex As Exception
                ErrMsg(ex)
            End Try
        End Set
    End Property

    <Bindable(False), Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Overridable Property EditingControlRowIndex As Integer _
    Implements IDataGridViewEditingControl.EditingControlRowIndex


    <Bindable(False), Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Property EditingControlValueChanged As Boolean _
    Implements IDataGridViewEditingControl.EditingControlValueChanged

    <DefaultValue(GetType(Keys()), "Nothing")> _
    Public Property InputProcessKeys As Keys() = Nothing

    Public Event FormWantsInputKey As KeyEventHandler


    Public Overridable Function EditingControlWantsInputKey(ByVal keyData _
    As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
    Implements IDataGridViewEditingControl.EditingControlWantsInputKey
        Try
            If InputProcessKeys IsNot Nothing _
                        AndAlso System.Array.IndexOf(InputProcessKeys, keyData) >= 0 Then
                Return True
            Else
                Dim e As New KeyEventArgs(keyData)
                RaiseEvent FormWantsInputKey(Me, e)
                Return e.Handled
            End If
        Catch ex As Exception
            ErrMsg(ex)
            Return False
        End Try
    End Function

    <Browsable(False)> _
    Public ReadOnly Property EditingPanelCursor() As Cursor _
    Implements IDataGridViewEditingControl.EditingPanelCursor
        Get
            'NEH
            Return _Control.Cursor
        End Get
    End Property

    Public Overridable Function GetEditingControlFormattedValue( _
    ByVal context As DataGridViewDataErrorContexts) As Object _
    Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
        'NEH
        Return Me.EditingControlFormattedValue
    End Function

    Public Overridable Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
    Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
        EditingControlValueChanged = False
    End Sub

    <Browsable(False)> _
    Public Overridable ReadOnly Property RepositionEditingControlOnValueChange() As Boolean _
    Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange
        Get
            'NEH
            Return False
        End Get
    End Property

    
    Private Sub OnControlTextChanged(ByVal sender As Object, ByVal e As EventArgs) _
    Handles _Control.TextChanged

        Try
            Me.OnTextChanged(e)
            If _Control IsNot Nothing Then
                MyBase.Text = _Control.Text
            End If
        Catch ex As Exception
            ErrMsg(ex)
        End Try
    End Sub


    Public Sub New(ByVal vControl As Control)
        MyBase.New()
        Me.Control = vControl
    End Sub

    Public Sub New()
        MyBase.New()

        InitializeComponent()
    End Sub

    Private Sub InitializeComponent()
        '4C#
    End Sub

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), _
    Browsable(False)> _
    Public Shadows Dock, Location, Size, Site, Anchor, ClientSize, Enabled, Focused, Height, _
    Left, MaximumSize, MinimumSize, Name, Padding, Parent, Region, TabIndex, TabStop, _
    Tag, Top, Visible, Width As DBNull
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 Code Project Open License (CPOL)


Written By
Lebanon Lebanon
ASP.Net Hosting on Linux server
---------------------------
There is a developer behind every piece of code!
DNA is too complex what about it!
No junk DNA; There is a functional role for noncoding DNA

Comments and Discussions