トップ回答者
DataGridViewTextBoxColumnの追加プロパティの保存方法について

質問
-
VB.NET2005で、DataGridViewTextBoxColumnを継承したカスタムコントロールを作成していて困った事があるので、投稿させて頂きます。
最初に通常のTextBoxコントロールを継承して、プロパティを拡張したコントロールを作成しました。(以下、MyTextBoxとし、拡張プロパティはKeyLimitとします。)
MyTextBoxを継承したEditingControlを作成
DataGridViewTextBoxCellを継承したMyTextBoxCellを作成
DataGridViewTextBoxColumnを継承したMyTextBoxColumnを作成しました。
MyTextBoxColumnにKeyLimitというプロパティを用意し、MyTextBoxのKeyLimitプロパティに渡す様にしているのですが、コードで指定した場合は正しく渡っていて正しく動作しています。(KeyLimitは文字の入力制限をしています。)
しかし、列の編集でプロパティを変更しても画面のDesignerに保存されず、もう一度列の編集を開くとデフォルトの値に戻ってしまい、困っています。
CellTemplateプロパティがあやしいと思っているのですが、どうしたら良いのか分かりません。何かヒントがありましたらご教授願います。
以下のページに同じ話題があり参考にさせて頂いたのですが、うまく行きませんでした。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34107&forum=7&9
以下、ソースです。(長くて申し訳ありません。)
' MyTextBoxコントロール
Public Class TextBox
Inherits System.Windows.Forms.TextBox
Private shtKeyLimit As Short
Public Overridable Property KeyLimit() As Short
Get
Return shtKeyLimit
End Get
Set(ByVal Value As Short)
shtKeyLimit = Value
End Set
End Property・・・以下省略
End Class'MyTextBoxEditingControlコントロール
Public Class MyTextBoxEditingControl
Inherits MyTextBox
Implements IDataGridViewEditingControlPrivate dataGridViewControl As DataGridView
Private valueIsChanged As Boolean = False
Private rowIndexNum As IntegerPublic Property EditingControlFormattedValue() As Object _
Implements IDataGridViewEditingControl.EditingControlFormattedValue
Get
Return Me.Text
End Get
Set(ByVal value As Object)
If TypeOf value Is [String] Then
Me.Text = value
End If
End Set
End PropertyPublic Function GetEditingControlFormattedValue(ByVal context As DataGridViewDataErrorContexts) As Object _
Implements IDataGridViewEditingControl.GetEditingControlFormattedValueReturn Me.Text
End FunctionPublic Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As DataGridViewCellStyle) _
Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControlMe.Font = dataGridViewCellStyle.Font
Me.ForeColor = dataGridViewCellStyle.ForeColor
Me.BackColor = dataGridViewCellStyle.BackColor
Me.TextAlign = translateAlignment(dataGridViewCellStyle.Alignment)Dim cell As TextBoxCell = EditingControlDataGridView.CurrentCell
Dim col As TextBoxColumn = cell.OwningColumn
Me.KeyLimit = col.KeyLimit
Me.MaxLength = col.MaxInputLength
End SubPublic Property EditingControlRowIndex() As Integer _
Implements IDataGridViewEditingControl.EditingControlRowIndexGet
Return rowIndexNum
End Get
Set(ByVal value As Integer)
rowIndexNum = value
End SetEnd Property
Public Function EditingControlWantsInputKey(ByVal key As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
Implements IDataGridViewEditingControl.EditingControlWantsInputKeySelect Case key And Keys.KeyCode
Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
Keys.Home, Keys.End, Keys.PageDown, Keys.PageUpReturn True
Case Else
Return False
End SelectEnd Function
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
Implements IDataGridViewEditingControl.PrepareEditingControlForEditIf selectAll Then
Me.SelectAll()
End If
End SubPublic ReadOnly Property RepositionEditingControlOnValueChange() As Boolean _
Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChangeGet
Return False
End GetEnd Property
Public Property EditingControlDataGridView() As DataGridView _
Implements IDataGridViewEditingControl.EditingControlDataGridViewGet
Return dataGridViewControl
End Get
Set(ByVal value As DataGridView)
dataGridViewControl = value
End SetEnd Property
Public Property EditingControlValueChanged() As Boolean _
Implements IDataGridViewEditingControl.EditingControlValueChangedGet
Return valueIsChanged
End Get
Set(ByVal value As Boolean)
valueIsChanged = value
End SetEnd Property
Public ReadOnly Property EditingControlCursor() As Cursor _
Implements IDataGridViewEditingControl.EditingPanelCursorGet
Return MyBase.Cursor
End GetEnd Property
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
valueIsChanged = True
If dataGridViewControl IsNot Nothing Then
dataGridViewControl.NotifyCurrentCellDirty(True)
End If
MyBase.OnTextChanged(e)
End SubPrivate Shared Function translateAlignment(ByVal align As DataGridViewContentAlignment) As HorizontalAlignment
Select Case align
Case DataGridViewContentAlignment.TopLeft, DataGridViewContentAlignment.MiddleLeft, DataGridViewContentAlignment.BottomLeft
Return HorizontalAlignment.LeftCase DataGridViewContentAlignment.TopCenter, DataGridViewContentAlignment.MiddleCenter, DataGridViewContentAlignment.BottomCenter
Return HorizontalAlignment.CenterCase DataGridViewContentAlignment.TopRight, DataGridViewContentAlignment.MiddleRight, DataGridViewContentAlignment.BottomRight
Return HorizontalAlignment.Right
End SelectReturn HorizontalAlignment.Left
End Function
End Class'MyTextBoxCellクラス
Public Class MyTextBoxCell
Inherits DataGridViewTextBoxCellPrivate shtKeyLimit As Short
Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
ByVal initialFormattedValue As Object, _
ByVal dataGridViewCellStyle As DataGridViewCellStyle)MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
Dim ctl As TextBoxEditingControl = DirectCast(DataGridView.EditingControl, MyTextBoxEditingControl)
ctl.Text = DirectCast(Me.Value, String)
ctl.KeyLimit = enmKeyLimit
ctl.MaxLength = Me.MaxInputLengthEnd Sub
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(MyTextBoxEditingControl)
End Get
End PropertyPublic Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(String)
End Get
End PropertyPublic Property KeyLimit() As Short
Get
Return shtKeyLimit
End Get
Set(ByVal value As Short)
shtKeyLimit = value
End Set
End PropertyPublic Overridable Shadows Function Clone() As Object
Dim cloneObj As TextBoxColumn = MyBase.Clone
cloneObj.KeyLimit = shtKeyLimit
cloneObj.MaxInputLength = Me.MaxInputLength
Return cloneObj
End FunctionEnd Class
'MyTextBoxColumnクラス
Public Class MyTextBoxColumn
Inherits DataGridViewTextBoxColumnPublic Sub New()
MyBase.New()
MyBase.CellTemplate = New MyTextBoxCell()
End SubPrivate Shadows Property CellTemplate() As MyTextBoxCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As MyTextBoxCell)
MyBase.CellTemplate = value
End Set
End PropertyPublic Property KeyLimit() As Short
Get
Return DirectCast(MyBase.CellTemplate, MyTextBoxCell).KeyLimit
End Get
Set(ByVal value As Short)
DirectCast(MyBase.CellTemplate, MyTextBoxCell).KeyLimit = value
End Set
End PropertyEnd Class
回答
-
お騒がせ致しました。解決致しました。
以下の部分を変更したら、うまくいきました。
Cloneメソッドの呼び出しと、単純な間違いをしていました。
'MyTextBoxCellクラスはCloneメソッドを修正
Public Overrides Function Clone() As Object
Dim cloneObj As MyTextBoxCell = MyBase.Clone
cloneObj.KeyLimit = shtKeyLimit
cloneObj.MaxInputLength = Me.MaxInputLength
Return cloneObj
End Function'MyTextBoxColumnクラスにCloneメソッドを追加
Public Overrides Function Clone() As Object
Dim cloneObj As MyTextBoxColumn = MyBase.Clone
cloneObj.KeyLimit = Me.KeyLimit
cloneObj.MaxInputLength = Me.MaxInputLength
Return cloneObj
End Functionお騒がせ致しました。