主婦と.NETと犬のぶろぐ

奥様 と プログラム と お犬様 の 楽しい日常

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

DataGridView(System.Windows.Forms.DataGridView)その3

今日は、
DataGridViewコントロール-行・列を固定する(えムナウのプログラミングのページ)
と、
方法 : Windows フォーム DataGridView Cells でコントロールをホストする
を参考に遊んでみました。

DataGridView は Excel の機能でいう、ウィンドウ枠の固定の様な事ができます。便利便利。
もう一個は、MaskedTextBox をもつ DataGridView の列 を作ってみました。
これは、参考にした 方法 : Windows フォーム DataGridView Cells でコントロールをホストする
DateTimePicker 列をそのまま、MaskedTextBox に変えてみました。
結構悩んだのが、Mask 文字列をどうやってコントロールに伝えるか。
引数付きのコンストラクタはダメーとか言われたりして、苦肉の策で OwningColumn を MaskedColumn にキャストして Mask を渡す事にしました。

■参考文献
DataGridViewコントロール-行・列を固定する(えムナウのプログラミングのページ)
方法 : Windows フォーム DataGridView Cells でコントロールをホストする

■実行画像
行を固定したの
DataGridView 行を固定

行と列を固定したの
DataGridView 行と列を固定

MaskedTextBox 列
DataGridView 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

投稿日時 : 2006年12月21日 13:07

Feedback

# re: DataGridView(System.Windows.Forms.DataGridView)その3 2006/12/21 16:34 えムナウ

>結構悩んだのが、Mask 文字列をどうやってコントロールに伝えるか。
public override object Clone() を実装してください。
http://mnow.wankuma.com/cs2005_datagridview_control5.html

# re: DataGridView(System.Windows.Forms.DataGridView)その3 2006/12/21 19:03 アクア

すっごく参考になります。

こんな事出来るんだ~って普通に感心しました。
しかも連日。

# あ~、テストしたい~! 確認したい~!
# でも、もう少し今やってることをやっとかないと全部中途半端な事に…

# re: DataGridView(System.Windows.Forms.DataGridView)その3 2006/12/21 19:28 なおこ(・∀・)

>> えムナウさん
「方法 : Windows フォーム DataGridView Cells でコントロールをホストする」より引用。
-------------------------------------------
メモ
DataGridViewCell や DataGridViewColumn から派生したクラスに新しいプロパティを追加するときは、Clone メソッドをオーバーライドし、複製操作時に新しいプロパティをコピーする必要があります。また、基本クラスの Clone メソッドを呼び出して、基本クラスのプロパティを新しいセルまたは列にコピーする必要もあります。
-------------------------------------------
思いっきり書いてありました...orz

今日メッセであーじゃこーじゃとアドバイスいただいた
改良版を明日アップします。

>> アクアさん
私も手探りでやってます。
結構おもしろいですね。

# re: DataGridView(System.Windows.Forms.DataGridView)その3 2006/12/22 12:59 Jitta

> 行を固定したの
こ 越えられない壁???

# re: DataGridView(System.Windows.Forms.DataGridView)その3 2006/12/22 14:42 なおこ(・∀・)

>> Jitta さん
2 行で固定しているのに意味はないですよw

タイトル  
名前  
Url
コメント