■■■

2016年4月2日土曜日

DataGridViewにオリジナル編集コントロールを設定する方法

DataGridViewにオリジナル編集コントロールを設定する方法
VB.NET
Imports System
Imports System.Windows.Forms

Public Class DataGridViewMaskedTextBoxColumn
Inherits DataGridViewColumn

Public Sub New()
MyBase.New(New DataGridViewMaskedTextBoxCell())
End Sub

Private
maskValue As String = ""
    Public Property Mask() As String
Get
Return Me
.maskValue
End Get
Set
(ByVal value As String)
Me.maskValue = value
End Set
End Property


Public Overrides Function Clone() As Object
Dim
col As DataGridViewMaskedTextBoxColumn = _
DirectCast(MyBase.Clone(), DataGridViewMaskedTextBoxColumn)
col.Mask =
Me.Mask
Return col
End Function

Public Overrides Property CellTemplate() As DataGridViewCell
Get
Return MyBase
.CellTemplate
End Get
Set
(ByVal value As DataGridViewCell)
If Not (TypeOf value Is DataGridViewMaskedTextBoxCell) Then
' Error

End If
MyBase
.CellTemplate = value
End Set
End Property
End Class


Public Class DataGridViewMaskedTextBoxCell
Inherits DataGridViewTextBoxCell

Public Sub New()
End Sub

Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
ByVal initialFormattedValue As Object, _
ByVal dataGridViewCellStyle As DataGridViewCellStyle)

MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _
dataGridViewCellStyle)

Dim maskedBox As DataGridViewMaskedTextBoxEditingControl = _
TryCast(Me.DataGridView.EditingControl, _
DataGridViewMaskedTextBoxEditingControl)
If maskedBox IsNot Nothing Then
Dim maskedText As String = TryCast(initialFormattedValue, String)
maskedBox.Text =
If(maskedText IsNot Nothing, maskedText, "")
Dim column As DataGridViewMaskedTextBoxColumn = _
TryCast(Me.OwningColumn, DataGridViewMaskedTextBoxColumn)
If column IsNot Nothing Then
maskedBox.Mask = column.Mask
End If
End If
End Sub


Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType
(DataGridViewMaskedTextBoxEditingControl)
End Get
End Property


Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType
(Object)
End Get
End Property


Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return MyBase
.DefaultNewRowValue
End Get
End Property
End Class


Public Class DataGridViewMaskedTextBoxEditingControl
Inherits MaskedTextBox
Implements IDataGridViewEditingControl

Private dataGridView As DataGridView
Private rowIndex As Integer
Private valueChanged As Boolean

Public Sub New()
Me.TabStop = False
End Sub

Public Function GetEditingControlFormattedValue( _
ByVal context As DataGridViewDataErrorContexts) As Object _
Implements IDataGridViewEditingControl.GetEditingControlFormattedValue

Return Me.Text
End Function

Public Property EditingControlFormattedValue() As Object _
Implements IDataGridViewEditingControl.EditingControlFormattedValue

Get
Return Me
.GetEditingControlFormattedValue( _
DataGridViewDataErrorContexts.Formatting)
End Get
Set
(ByVal value As Object)
Me.Text = DirectCast(value, String)
End Set
End Property


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

Me.Font = dataGridViewCellStyle.Font
Me.ForeColor = dataGridViewCellStyle.ForeColor
Me.BackColor = dataGridViewCellStyle.BackColor
Select Case dataGridViewCellStyle.Alignment
Case DataGridViewContentAlignment.BottomCenter, _
DataGridViewContentAlignment.MiddleCenter, _
DataGridViewContentAlignment.TopCenter

Me.TextAlign = HorizontalAlignment.Center
Exit Select
Case
DataGridViewContentAlignment.BottomRight, _
DataGridViewContentAlignment.MiddleRight, _
DataGridViewContentAlignment.TopRight

Me.TextAlign = HorizontalAlignment.Right
Exit Select
Case Else
Me
.TextAlign = HorizontalAlignment.Left
Exit Select
End Select
End Sub


Public Property EditingControlDataGridView() As DataGridView _
Implements IDataGridViewEditingControl.EditingControlDataGridView

Get
Return Me
.dataGridView
End Get
Set
(ByVal value As DataGridView)
Me.dataGridView = value
End Set
End Property


Public Property EditingControlRowIndex() As Integer _
Implements IDataGridViewEditingControl.EditingControlRowIndex

Get
Return Me
.rowIndex
End Get
Set
(ByVal value As Integer)
Me.rowIndex = value
End Set
End Property


Public Property EditingControlValueChanged() As Boolean _
Implements IDataGridViewEditingControl.EditingControlValueChanged

Get
Return Me
.valueChanged
End Get
Set
(ByVal value As Boolean)
Me.valueChanged = value
End Set
End Property


Public Function EditingControlWantsInputKey(ByVal keyData As Keys, _
ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
Implements IDataGridViewEditingControl.EditingControlWantsInputKey

Select Case keyData And Keys.KeyCode
Case Keys.Right, Keys.[End], Keys.Left, Keys.Home
Return True
Case Else
Return Not
dataGridViewWantsInputKey
End Select
End Function


Public ReadOnly Property EditingPanelCursor() As Cursor _
Implements IDataGridViewEditingControl.EditingPanelCursor

Get
Return MyBase
.Cursor
End Get
End Property


Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
Implements IDataGridViewEditingControl.PrepareEditingControlForEdit

If selectAll Then
Me.SelectAll()
Else
Me.SelectionStart = Me.TextLength
End If
End Sub


Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean _
Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange

Get
Return False
End Get
End Property

Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
MyBase.OnTextChanged(e)
Me.valueChanged = True
Me
.dataGridView.NotifyCurrentCellDirty(True)
End Sub
End Class
Dim maskedColumn As New DataGridViewMaskedTextBoxColumn()
maskedColumn.DataPropertyName = "col1"
maskedColumn.Mask = "000"
dgv1.Columns.Add(maskedColumn)
C#
using System;
using System.Windows.Forms;

public class DataGridViewMaskedTextBoxColumn :
DataGridViewColumn
{
public DataGridViewMaskedTextBoxColumn()
: base(new DataGridViewMaskedTextBoxCell())
{
}

private string maskValue = "";
public string Mask
{
get
{
return this.maskValue;
}
set
{
this.maskValue = value;
}
}

public override object Clone()
{
DataGridViewMaskedTextBoxColumn col =
(DataGridViewMaskedTextBoxColumn)base.Clone();
col.Mask = this.Mask;
return col;
}

public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (!(value is DataGridViewMaskedTextBoxCell))
{
// Error
}
base.CellTemplate = value;
}
}
}

public class DataGridViewMaskedTextBoxCell :
DataGridViewTextBoxCell
{
public DataGridViewMaskedTextBoxCell()
{
}

public override void InitializeEditingControl(
int rowIndex, object initialFormattedValue,
DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex,
initialFormattedValue, dataGridViewCellStyle);

DataGridViewMaskedTextBoxEditingControl maskedBox =
this.DataGridView.EditingControl as
DataGridViewMaskedTextBoxEditingControl;
if (maskedBox != null)
{
string maskedText = initialFormattedValue as string;
maskedBox.Text = maskedText != null ? maskedText : "";
DataGridViewMaskedTextBoxColumn column =
this.OwningColumn as DataGridViewMaskedTextBoxColumn;
if (column != null)
{
maskedBox.Mask = column.Mask;
}
}
}

public override Type EditType
{
get
{
return typeof(DataGridViewMaskedTextBoxEditingControl);
}
}

public override Type ValueType
{
get
{
return typeof(object);
}
}

public override object DefaultNewRowValue
{
get
{
return base.DefaultNewRowValue;
}
}
}

public class DataGridViewMaskedTextBoxEditingControl :
MaskedTextBox, IDataGridViewEditingControl
{
DataGridView dataGridView;
int rowIndex;
bool valueChanged;

public DataGridViewMaskedTextBoxEditingControl()
{
this.TabStop = false;
}


public object GetEditingControlFormattedValue(
DataGridViewDataErrorContexts context)
{
return this.Text;
}

public object EditingControlFormattedValue
{
get
{
return this.GetEditingControlFormattedValue(
DataGridViewDataErrorContexts.Formatting);
}
set
{
this.Text = (string)value;
}
}

public void ApplyCellStyleToEditingControl(
DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
switch (dataGridViewCellStyle.Alignment)
{
case DataGridViewContentAlignment.BottomCenter:
case DataGridViewContentAlignment.MiddleCenter:
case DataGridViewContentAlignment.TopCenter:
this.TextAlign = HorizontalAlignment.Center;
break;
case DataGridViewContentAlignment.BottomRight:
case DataGridViewContentAlignment.MiddleRight:
case DataGridViewContentAlignment.TopRight:
this.TextAlign = HorizontalAlignment.Right;
break;
default:
this.TextAlign = HorizontalAlignment.Left;
break;
}
}

public DataGridView EditingControlDataGridView
{
get
{
return this.dataGridView;
}
set
{
this.dataGridView = value;
}
}

public int EditingControlRowIndex
{
get
{
return this.rowIndex;
}
set
{
this.rowIndex = value;
}
}

public bool EditingControlValueChanged
{
get
{
return this.valueChanged;
}
set
{
this.valueChanged = value;
}
}

public bool EditingControlWantsInputKey(
Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Right:
case Keys.End:
case Keys.Left:
case Keys.Home:
return true;
default:
return !dataGridViewWantsInputKey;
}
}

public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}

public void PrepareEditingControlForEdit(bool selectAll)
{
if (selectAll)
{
this.SelectAll();
}
else
{
this.SelectionStart = this.TextLength;
}
}

public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}

protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
this.valueChanged = true;
this.dataGridView.NotifyCurrentCellDirty(true);
}
}
DataGridViewMaskedTextBoxColumn maskedColumn =
new DataGridViewMaskedTextBoxColumn();
maskedColumn.DataPropertyName = "col1";
maskedColumn.Mask = "000";
dgv1.Columns.Add(maskedColumn);







■■■