今日は、
DataGridViewコントロール-行・列を固定する(えムナウのプログラミングのページ)
と、
方法 : Windows フォーム DataGridView Cells でコントロールをホストする
を参考に遊んでみました。
DataGridView は Excel の機能でいう、ウィンドウ枠の固定の様な事ができます。便利便利。
もう一個は、MaskedTextBox をもつ DataGridView の列 を作ってみました。
これは、参考にした 方法 : Windows フォーム DataGridView Cells でコントロールをホストする の
DateTimePicker 列をそのまま、MaskedTextBox に変えてみました。
結構悩んだのが、Mask 文字列をどうやってコントロールに伝えるか。
引数付きのコンストラクタはダメーとか言われたりして、苦肉の策で OwningColumn を MaskedColumn にキャストして Mask を渡す事にしました。
■参考文献
DataGridViewコントロール-行・列を固定する(えムナウのプログラミングのページ)
方法 : Windows フォーム DataGridView Cells でコントロールをホストする
■実行画像
行を固定したの
行と列を固定したの
MaskedTextBox 列
Public Class DataGridViewTest
Private Sub DataGridViewTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Size = New Size(600, 300)
'' TabControl に DataGridView を描画します。
Dim tabCntrl As TabControl = New TabControl
Me.Controls.Add(tabCntrl)
tabCntrl.Dock = DockStyle.Fill
tabCntrl.TabPages.Clear()
' TabPage の追加(2006.12.19 DataGridView(System.Windows.Forms.DataGridView)その1参照)
Dim dgView1 As DataGridView = New DataGridView
Me.AddTabPage(tabCntrl, "DataGridViewコントロール-内部コントロールの種類", dgView1)
Me.DataGridViewコントロール_内部コントロールの種類(dgView1)
' TabPage の追加(2006.12.20 DataGridView(System.Windows.Forms.DataGridView)その2参照)
Dim dgView2 As DataGridView = New DataGridView
Me.AddTabPage(tabCntrl, "DataGridViewコントロール-バインド出来るデータソース", dgView2)
Me.DataGridViewコントロール_バインド出来るデータソース(dgView2)
' TabPage の追加(2006.12.20 DataGridView(System.Windows.Forms.DataGridView)その2参照)
Dim dgView3 As DataGridView = New DataGridView
Me.AddTabPage(tabCntrl, "DataGridViewコントロール-DataGridViewCellStyleクラス", dgView3)
Me.DataGridViewコントロール_DataGridViewCellStyleクラス(dgView3)
' TabPage の追加(2006.12.21)
Dim dgView4 As DataGridView = New DataGridView
Me.AddTabPage(tabCntrl, "DataGridViewコントロール-行を固定する", dgView4)
Me.DataGridViewコントロール_行を固定する(dgView4)
' TabPage の追加(2006.12.21)
Dim dgView5 As DataGridView = New DataGridView
Me.AddTabPage(tabCntrl, "DataGridViewコントロール-行・列を固定する", dgView5)
Me.DataGridViewコントロール_行・列を固定する(dgView5)
' TabPage の追加(2006.12.21)
Dim dgView6 As DataGridView = New DataGridView
Me.AddTabPage(tabCntrl, "Mask列を追加する", dgView6)
Me.Mask列を追加する(dgView6)
tabCntrl.SelectedIndex = tabCntrl.TabPages.Count - 1
End Sub
Private Sub DataGridViewコントロール_行を固定する(ByVal dgView As DataGridView)
' なんか適当なデータをバインドする
Dim ds As DataSet = Me.CreateWankumaDataset()
dgView.DataSource = ds
ds.Tables(0).Columns.Add("NullColumn1", GetType(String))
ds.Tables(0).Columns.Add("NullColumn2", GetType(String))
ds.Tables(0).Columns.Add("NullColumn3", GetType(String))
ds.Tables(0).Columns.Add("NullColumn4", GetType(String))
ds.Tables(0).Columns.Add("NullColumn5", GetType(String))
dgView.DataMember = ds.Tables(0).TableName
' 2 行目で固定する
dgView.Rows(1).Frozen = True
' 区分線を太くする
dgView.Rows(1).DividerHeight = 5
End Sub
Private Sub DataGridViewコントロール_行・列を固定する(ByVal dgView As DataGridView)
' なんか適当なデータをバインドする
Dim ds As DataSet = Me.CreateWankumaDataset()
dgView.DataSource = ds
ds.Tables(0).Columns.Add("NullColumn1", GetType(String))
ds.Tables(0).Columns.Add("NullColumn2", GetType(String))
ds.Tables(0).Columns.Add("NullColumn3", GetType(String))
ds.Tables(0).Columns.Add("NullColumn4", GetType(String))
ds.Tables(0).Columns.Add("NullColumn5", GetType(String))
dgView.DataMember = ds.Tables(0).TableName
' 2 行目で固定する
dgView.Rows(1).Frozen = True
' 2 列目で固定する
dgView.Columns(1).Frozen = True
' 区分線を太くする
dgView.Columns(1).DividerWidth = 5
dgView.Rows(1).DividerHeight = 5
End Sub
Private Sub Mask列を追加する(ByVal dgView As DataGridView)
Dim maskCol As MaskedColumn = New MaskedColumn()
maskCol.Mask = "000-0000"
dgView.Columns.Add(maskCol)
dgView.RowCount = 5
End Sub
#Region "Private Sub DataGridViewコントロール_DataGridViewCellStyleクラス"
DataGridView(System.Windows.Forms.DataGridView)その2参照
#End Region
#Region "Private Sub CustomCellPaint"
DataGridView(System.Windows.Forms.DataGridView)その2参照
#End Region
#Region "Private Sub DataGridViewコントロール_バインド出来るデータソース"
DataGridView(System.Windows.Forms.DataGridView)その2参照
#End Region
#Region "Private Sub DataGridViewコントロール_内部コントロールの種類"
DataGridView(System.Windows.Forms.DataGridView)その1参照
#End Region
#Region "Private Sub OnCellContentClick"
DataGridView(System.Windows.Forms.DataGridView)その1参照
#End Region
#Region "Private Sub AddTabPage"
DataGridView(System.Windows.Forms.DataGridView)その1参照
#End Region
#Region "Private Function CreateWankumaDataset"
DataGridView(System.Windows.Forms.DataGridView)その2参照
#End Region
End Class
#Region "Public Class Pet"
DataGridView(System.Windows.Forms.DataGridView)その2参照
#End Region
'''
''' MaskedEditingControl
'''
Public Class MaskedEditingControl
Inherits MaskedTextBox
Implements IDataGridViewEditingControl
Private dataGridViewControl As DataGridView
Private valueIsChanged As Boolean = False
Private rowIndexNum As Integer
Public Sub New()
End Sub
Public Property EditingControlFormattedValue() As Object _
Implements IDataGridViewEditingControl.EditingControlFormattedValue
Get
Return MyBase.Text
End Get
Set(ByVal value As Object)
If TypeOf value Is [String] Then
MyBase.Text = Convert.ToString(value)
End If
End Set
End Property
Public Function GetEditingControlFormattedValue(ByVal context _
As DataGridViewDataErrorContexts) As Object _
Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
Return MyBase.Text
End Function
Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As _
DataGridViewCellStyle) _
Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
MyBase.Font = dataGridViewCellStyle.Font
MyBase.BackColor = dataGridViewCellStyle.BackColor
MyBase.ForeColor = dataGridViewCellStyle.ForeColor
MyBase.BorderStyle = Windows.Forms.BorderStyle.None
End Sub
Public Property EditingControlRowIndex() As Integer _
Implements IDataGridViewEditingControl.EditingControlRowIndex
Get
Return Me.rowIndexNum
End Get
Set(ByVal value As Integer)
Me.rowIndexNum = value
End Set
End Property
Public Function EditingControlWantsInputKey(ByVal key As Keys, _
ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
Implements IDataGridViewEditingControl.EditingControlWantsInputKey
Return True
End Function
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
End Sub
Public ReadOnly Property RepositionEditingControlOnValueChange() _
As Boolean Implements _
IDataGridViewEditingControl.RepositionEditingControlOnValueChange
Get
Return False
End Get
End Property
Public Property EditingControlDataGridView() As DataGridView _
Implements IDataGridViewEditingControl.EditingControlDataGridView
Get
Return Me.dataGridViewControl
End Get
Set(ByVal value As DataGridView)
Me.dataGridViewControl = value
End Set
End Property
Public Property EditingControlValueChanged() As Boolean _
Implements IDataGridViewEditingControl.EditingControlValueChanged
Get
Return Me.valueIsChanged
End Get
Set(ByVal value As Boolean)
Me.valueIsChanged = value
End Set
End Property
Public ReadOnly Property EditingControlCursor() As Cursor _
Implements IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
Me.valueIsChanged = True
Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
MyBase.OnTextChanged(e)
End Sub
End Class
'''
''' MaskedCell
'''
Public Class MaskedCell
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 ctl As MaskedEditingControl = _
DirectCast(DataGridView.EditingControl, MaskedEditingControl)
ctl.Mask = DirectCast(MyBase.OwningColumn, MaskedColumn).Mask
ctl.Text = Convert.ToString(Me.Value)
End Sub
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(MaskedEditingControl)
End Get
End Property
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(String)
End Get
End Property
Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return String.Empty
End Get
End Property
End Class
'''
''' MaskedColumn
'''
Public Class MaskedColumn
Inherits DataGridViewColumn
Private m_mask As String
Public Property Mask() As String
Get
Return Me.m_mask
End Get
Set(ByVal value As String)
Me.m_mask = value
End Set
End Property
Public Sub New()
MyBase.New(New MaskedCell())
End Sub
Public Overrides Property CellTemplate() As DataGridViewCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As DataGridViewCell)
If Not (value Is Nothing) AndAlso _
Not value.GetType().IsAssignableFrom(GetType(MaskedCell)) _
Then
Throw New InvalidCastException("Must be a MaskedCell")
End If
MyBase.CellTemplate = value
End Set
End Property
End Class