' 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