DataGridView控件用法合集(十一)

近期将DataGridView常用的一些用法做了一个整理。为防止页面过长,现分批贴出来,此为第十一部分。

DataGridView特殊控件

56. DataGridView根据值不同在另一列中显示相应图片
57. DataGridView中显示进度条(ProgressBar)
58. DataGridView中添加MaskedTextBox

56. DataGridView根据值不同在另一列中显示相应图片

57. DataGridView中显示进度条(ProgressBar)

[VB.NET]

Imports System

Imports System.Drawing

Imports System.Windows.Forms

''' <summary>

''' DataGridViewProgressBarCellオブジェクトの列

''' </summary>

Public Class DataGridViewProgressBarColumn

Inherits DataGridViewTextBoxColumn

'コンストラクタ

Public Sub New()

Me.CellTemplate = New DataGridViewProgressBarCell()

End Sub

'CellTemplateの取得と設定

Public Overrides Property CellTemplate() As DataGridViewCell

Get

Return MyBase.CellTemplate

End Get

Set(ByVal value As DataGridViewCell)

'DataGridViewProgressBarCell以外はホストしない

If Not TypeOf value Is DataGridViewProgressBarCell Then

Throw New InvalidCastException( _

"DataGridViewProgressBarCellオブジェクトを" + _

"指定してください。")

End If

MyBase.CellTemplate = value

End Set

End Property

''' <summary>

''' ProgressBarの最大値

''' </summary>

Public Property Maximum() As Integer

Get

Return CType(Me.CellTemplate,DataGridViewProgressBarCell).Maximum

End Get

Set(ByVal value As Integer)

If Me.Maximum = value Then

Return

End If

'セルテンプレートの値を変更する

CType(Me.CellTemplate,DataGridViewProgressBarCell).Maximum = value

'DataGridViewにすでに追加されているセルの値を変更する

If Me.DataGridView Is Nothing Then

Return

End If

Dim rowCount As Integer = Me.DataGridView.RowCount

Dim i As Integer

For i = 0 To rowCount - 1

Dim r As DataGridViewRow = Me.DataGridView.Rows.SharedRow(i)

CType(r.Cells(Me.Index),DataGridViewProgressBarCell).Maximum = _

value

Next i

End Set

End Property

''' <summary>

''' ProgressBarの最小値

''' </summary>

Public Property Mimimum() As Integer

Get

Return CType(Me.CellTemplate,DataGridViewProgressBarCell).Mimimum

End Get

Set(ByVal value As Integer)

If Me.Mimimum = value Then

Return

End If

'セルテンプレートの値を変更する

CType(Me.CellTemplate,DataGridViewProgressBarCell).Mimimum = value

'DataGridViewにすでに追加されているセルの値を変更する

If Me.DataGridView Is Nothing Then

Return

End If

Dim rowCount As Integer = Me.DataGridView.RowCount

Dim i As Integer

For i = 0 To rowCount - 1

Dim r As DataGridViewRow = Me.DataGridView.Rows.SharedRow(i)

CType(r.Cells(Me.Index),DataGridViewProgressBarCell).Mimimum = _

value

Next i

End Set

End Property

End Class

''' <summary>

''' ProgressBarをDataGridViewに表示する

''' </summary>

Public Class DataGridViewProgressBarCell

Inherits DataGridViewTextBoxCell

'コンストラクタ

Public Sub New()

Me.maximumValue = 100

Me.mimimumValue = 0

End Sub

Private maximumValue As Integer

Public Property Maximum() As Integer

Get

Return Me.maximumValue

End Get

Set(ByVal value As Integer)

Me.maximumValue = value

End Set

End Property

Private mimimumValue As Integer

Public Property Mimimum() As Integer

Get

Return Me.mimimumValue

End Get

Set(ByVal value As Integer)

Me.mimimumValue = value

End Set

End Property

'セルの値のデータ型を指定する

'ここでは、整数型とする

Public Overrides ReadOnly Property ValueType() As Type

Get

Return GetType(Integer)

End Get

End Property

'新しいレコード行のセルの既定値を指定する

Public Overrides ReadOnly Property DefaultNewRowValue() As Object

Get

Return 0

End Get

End Property

'新しいプロパティを追加しているため、

' Cloneメソッドをオーバーライドする必要がある

Public Overrides Function Clone() As Object

Dim cell As DataGridViewProgressBarCell = _

CType(MyBase.Clone(),DataGridViewProgressBarCell)

cell.Maximum = Me.Maximum

cell.Mimimum = Me.Mimimum

Return cell

End Function

Protected Overrides Sub Paint(ByVal graphics As Graphics,_

ByVal clipBounds As Rectangle,_

ByVal cellBounds As Rectangle,_

ByVal rowIndex As Integer,_

ByVal cellState As DataGridViewElementStates,_

ByVal value As Object,_

ByVal formattedValue As Object,_

ByVal errorText As String,_

ByVal cellStyle As DataGridViewCellStyle,_

ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle,_

ByVal paintParts As DataGridViewPaintParts)

'値を決定する

Dim intValue As Integer = 0

If TypeOf value Is Integer Then

intValue = CInt(value)

End If

If intValue < Me.mimimumValue Then

intValue = Me.mimimumValue

End If

If intValue > Me.maximumValue Then

intValue = Me.maximumValue

End If

'割合を計算する

Dim rate As Double = CDbl(intValue - Me.mimimumValue) / _

(Me.maximumValue - Me.mimimumValue)

'セルの境界線(枠)を描画する

If (paintParts And DataGridViewPaintParts.Border) = _

DataGridViewPaintParts.Border Then

Me.PaintBorder(graphics,clipBounds,cellBounds,_

cellStyle,advancedBorderStyle)

End If

'境界線の内側に範囲を取得する

Dim borderRect As Rectangle = Me.BorderWidths(advancedBorderStyle)

Dim paintRect As New Rectangle(cellBounds.Left + borderRect.Left,_

cellBounds.Top + borderRect.Top,_

cellBounds.Width - borderRect.Right,_

cellBounds.Height - borderRect.Bottom)

'背景色を決定する

'選択されている時とされていない時で色を変える

Dim isSelected As Boolean = _

((cellState And DataGridViewElementStates.Selected) = _

DataGridViewElementStates.Selected)

Dim bkColor As Color

If isSelected AndAlso _

(paintParts And DataGridViewPaintParts.SelectionBackground) = _

DataGridViewPaintParts.SelectionBackground Then

bkColor = cellStyle.SelectionBackColor

Else

bkColor = cellStyle.BackColor

End If

'背景を描画する

If (paintParts And DataGridViewPaintParts.Background) = _

DataGridViewPaintParts.Background Then

Dim backBrush As New SolidBrush(bkColor)

Try

graphics.FillRectangle(backBrush,paintRect)

Finally

backBrush.Dispose()

End Try

End If

'Paddingを差し引く

paintRect.Offset(cellStyle.Padding.Right,cellStyle.Padding.Top)

paintRect.Width -= cellStyle.Padding.Horizontal

paintRect.Height -= cellStyle.Padding.Vertical

'ProgressBarを描画する

If (paintParts And DataGridViewPaintParts.ContentForeground) = _

DataGridViewPaintParts.ContentForeground Then

If ProgressBarRenderer.IsSupported Then

'visualスタイルで描画する

'ProgressBarの枠を描画する

ProgressBarRenderer.DrawHorizontalBar(graphics,paintRect)

'ProgressBarのバーを描画する

Dim barBounds As New Rectangle(paintRect.Left + 3,_

paintRect.Top + 3,_

paintRect.Width - 4,_

paintRect.Height - 6)

barBounds.Width = CInt(Math.Round((barBounds.Width * rate)))

ProgressBarRenderer.DrawHorizontalChunks(graphics,barBounds)

Else

'visualスタイルで描画できない時

graphics.FillRectangle(Brushes.White,paintRect)

graphics.DrawRectangle(Pens.Black,paintRect)

Dim barBounds As New Rectangle(paintRect.Left + 1,_

paintRect.Top + 1,_

paintRect.Width - 1,_

paintRect.Height - 1)

barBounds.Width = CInt(Math.Round((barBounds.Width * rate)))

graphics.FillRectangle(Brushes.Blue,barBounds)

End If

End If

'フォーカスの枠を表示する

If Me.DataGridView.CurrentCellAddress.X = Me.ColumnIndex AndAlso _

Me.DataGridView.CurrentCellAddress.Y = Me.RowIndex AndAlso _

(paintParts And DataGridViewPaintParts.Focus) = _

DataGridViewPaintParts.Focus AndAlso _

Me.DataGridView.Focused Then

'フォーカス枠の大きさを適当に決める

Dim focusRect As Rectangle = paintRect

focusRect.Inflate(-3,-3)

ControlPaint.DrawFocusRectangle(graphics,focusRect)

'背景色を指定してフォーカス枠を描画する時

'ControlPaint.DrawFocusRectangle(

' graphics,focusRect,Color.Empty,bkColor);

End If

'テキストを表示する

If (paintParts And DataGridViewPaintParts.ContentForeground) = _

DataGridViewPaintParts.ContentForeground Then

'表示するテキストを決定

Dim txt As String = String.Format("{0}%",Math.Round((rate * 100)))

'string txt = formattedValue.ToString();

'本来は、cellStyleによりTextFormatFlagsを決定すべき

Dim flags As TextFormatFlags = _

TextFormatFlags.HorizontalCenter Or _

TextFormatFlags.VerticalCenter

'色を決定

Dim fColor As Color = cellStyle.ForeColor

'if (isSelected)

' fColor = cellStyle.SelectionForeColor;

'else

' fColor = cellStyle.ForeColor;

'テキストを描画する

paintRect.Inflate(-2,-2)

TextRenderer.DrawText( _

graphics,txt,cellStyle.Font,paintRect,fColor,flags)

End If

'エラーアイコンの表示

If (paintParts And DataGridViewPaintParts.ErrorIcon) = _

DataGridViewPaintParts.ErrorIcon AndAlso _

Me.DataGridView.ShowCellErrors AndAlso _

Not String.IsNullOrEmpty(errorText) Then

'エラーアイコンを表示させる領域を取得

Dim iconBounds As Rectangle = _

Me.GetErrorIconBounds(graphics,cellStyle,rowIndex)

iconBounds.Offset(cellBounds.X,cellBounds.Y)

'エラーアイコンを描画

Me.PaintErrorIcon(graphics,iconBounds,errorText)

End If

End Sub

End Class

[C#]

using System;

using System.Drawing;

using System.Windows.Forms;

/// <summary>

/// DataGridViewProgressBarCellオブジェクトの列

/// </summary>

public class DataGridViewProgressBarColumn : DataGridViewTextBoxColumn

{

//コンストラクタ

public DataGridViewProgressBarColumn()

{

this.CellTemplate = new DataGridViewProgressBarCell();

}

//CellTemplateの取得と設定

public override DataGridViewCell CellTemplate

{

get

{

return base.CellTemplate;

}

set

{

//DataGridViewProgressBarCell以外はホストしない

if (!(value is DataGridViewProgressBarCell))

{

throw new InvalidCastException(

"DataGridViewProgressBarCellオブジェクトを" +

"指定してください。");

}

base.CellTemplate = value;

}

}

/// <summary>

/// ProgressBarの最大値

/// </summary>

public int Maximum

{

get

{

return ((DataGridViewProgressBarCell)this.CellTemplate).Maximum;

}

set

{

if (this.Maximum == value)

return;

//セルテンプレートの値を変更する

((DataGridViewProgressBarCell)this.CellTemplate).Maximum =

value;

//DataGridViewにすでに追加されているセルの値を変更する

if (this.DataGridView == null)

return;

int rowCount = this.DataGridView.RowCount;

for (int i = 0; i < rowCount; i++)

{

DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);

((DataGridViewProgressBarCell)r.Cells[this.Index]).Maximum =

value;

}

}

}

/// <summary>

/// ProgressBarの最小値

/// </summary>

public int Mimimum

{

get

{

return ((DataGridViewProgressBarCell)this.CellTemplate).Mimimum;

}

set

{

if (this.Mimimum == value)

return;

//セルテンプレートの値を変更する

((DataGridViewProgressBarCell)this.CellTemplate).Mimimum =

value;

//DataGridViewにすでに追加されているセルの値を変更する

if (this.DataGridView == null)

return;

int rowCount = this.DataGridView.RowCount;

for (int i = 0; i < rowCount; i++)

{

DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);

((DataGridViewProgressBarCell)r.Cells[this.Index]).Mimimum =

value;

}

}

}

}

/// <summary>

/// ProgressBarをDataGridViewに表示する

/// </summary>

public class DataGridViewProgressBarCell : DataGridViewTextBoxCell

{

//コンストラクタ

public DataGridViewProgressBarCell()

{

this.maximumValue = 100;

this.mimimumValue = 0;

}

private int maximumValue;

public int Maximum

{

get

{

return this.maximumValue;

}

set

{

this.maximumValue = value;

}

}

private int mimimumValue;

public int Mimimum

{

get

{

return this.mimimumValue;

}

set

{

this.mimimumValue = value;

}

}

//セルの値のデータ型を指定する

//ここでは、整数型とする

public override Type ValueType

{

get

{

return typeof(int);

}

}

//新しいレコード行のセルの既定値を指定する

public override object DefaultNewRowValue

{

get

{

return 0;

}

}

//新しいプロパティを追加しているため、

// Cloneメソッドをオーバーライドする必要がある

public override object Clone()

{

DataGridViewProgressBarCell cell =

(DataGridViewProgressBarCell)base.Clone();

cell.Maximum = this.Maximum;

cell.Mimimum = this.Mimimum;

return cell;

}

protected override void Paint(Graphics graphics,

Rectangle clipBounds,Rectangle cellBounds,

int rowIndex,DataGridViewElementStates cellState,

object value,object formattedValue,string errorText,

DataGridViewCellStyle cellStyle,

DataGridViewAdvancedBorderStyle advancedBorderStyle,

DataGridViewPaintParts paintParts)

{

//値を決定する

int intValue = 0;

if (value is int)

intValue = (int)value;

if (intValue < this.mimimumValue)

intValue = this.mimimumValue;

if (intValue > this.maximumValue)

intValue = this.maximumValue;

//割合を計算する

double rate = (double)(intValue - this.mimimumValue) /

(this.maximumValue - this.mimimumValue);

//セルの境界線(枠)を描画する

if ((paintParts & DataGridViewPaintParts.Border) ==

DataGridViewPaintParts.Border)

{

this.PaintBorder(graphics,

cellStyle,advancedBorderStyle);

}

//境界線の内側に範囲を取得する

Rectangle borderRect = this.BorderWidths(advancedBorderStyle);

Rectangle paintRect = new Rectangle(

cellBounds.Left + borderRect.Left,

cellBounds.Top + borderRect.Top,

cellBounds.Width - borderRect.Right,

cellBounds.Height - borderRect.Bottom);

//背景色を決定する

//選択されている時とされていない時で色を変える

bool isSelected =

(cellState & DataGridViewElementStates.Selected) ==

DataGridViewElementStates.Selected;

Color bkColor;

if (isSelected &&

(paintParts & DataGridViewPaintParts.SelectionBackground) ==

DataGridViewPaintParts.SelectionBackground)

{

bkColor = cellStyle.SelectionBackColor;

}

else

{

bkColor = cellStyle.BackColor;

}

//背景を描画する

if ((paintParts & DataGridViewPaintParts.Background) ==

DataGridViewPaintParts.Background)

{

using (SolidBrush backBrush = new SolidBrush(bkColor))

{

graphics.FillRectangle(backBrush,paintRect);

}

}

//Paddingを差し引く

paintRect.Offset(cellStyle.Padding.Right,cellStyle.Padding.Top);

paintRect.Width -= cellStyle.Padding.Horizontal;

paintRect.Height -= cellStyle.Padding.Vertical;

//ProgressBarを描画する

if ((paintParts & DataGridViewPaintParts.ContentForeground) ==

DataGridViewPaintParts.ContentForeground)

{

if (ProgressBarRenderer.IsSupported)

{

//visualスタイルで描画する

//ProgressBarの枠を描画する

ProgressBarRenderer.DrawHorizontalBar(graphics,paintRect);

//ProgressBarのバーを描画する

Rectangle barBounds = new Rectangle(

paintRect.Left + 3,paintRect.Top + 3,

paintRect.Width - 4,paintRect.Height - 6);

barBounds.Width = (int)Math.Round(barBounds.Width * rate);

ProgressBarRenderer.DrawHorizontalChunks(graphics,barBounds);

}

else

{

//visualスタイルで描画できない時

graphics.FillRectangle(Brushes.White,paintRect);

graphics.DrawRectangle(Pens.Black,paintRect);

Rectangle barBounds = new Rectangle(

paintRect.Left + 1,paintRect.Top + 1,

paintRect.Width - 1,paintRect.Height - 1);

barBounds.Width = (int)Math.Round(barBounds.Width * rate);

graphics.FillRectangle(Brushes.Blue,barBounds);

}

}

//フォーカスの枠を表示する

if (this.DataGridView.CurrentCellAddress.X == this.ColumnIndex &&

this.DataGridView.CurrentCellAddress.Y == this.RowIndex &&

(paintParts & DataGridViewPaintParts.Focus) ==

DataGridViewPaintParts.Focus &&

this.DataGridView.Focused)

{

//フォーカス枠の大きさを適当に決める

Rectangle focusRect = paintRect;

focusRect.Inflate(-3,-3);

ControlPaint.DrawFocusRectangle(graphics,focusRect);

//背景色を指定してフォーカス枠を描画する時

//ControlPaint.DrawFocusRectangle(

// graphics,bkColor);

}

//テキストを表示する

if ((paintParts & DataGridViewPaintParts.ContentForeground) ==

DataGridViewPaintParts.ContentForeground)

{

//表示するテキストを決定

string txt = string.Format("{0}%",Math.Round(rate * 100));

//string txt = formattedValue.ToString();

//本来は、cellStyleによりTextFormatFlagsを決定すべき

TextFormatFlags flags = TextFormatFlags.HorizontalCenter |

TextFormatFlags.VerticalCenter;

//色を決定

Color fColor = cellStyle.ForeColor;

//if (isSelected)

// fColor = cellStyle.SelectionForeColor;

//else

// fColor = cellStyle.ForeColor;

//テキストを描画する

paintRect.Inflate(-2,-2);

TextRenderer.DrawText(graphics,

paintRect,flags);

}

//エラーアイコンの表示

if ((paintParts & DataGridViewPaintParts.ErrorIcon) ==

DataGridViewPaintParts.ErrorIcon &&

this.DataGridView.ShowCellErrors &&

!string.IsNullOrEmpty(errorText))

{

//エラーアイコンを表示させる領域を取得

Rectangle iconBounds = this.GetErrorIconBounds(

graphics,rowIndex);

iconBounds.Offset(cellBounds.X,cellBounds.Y);

//エラーアイコンを描画

this.PaintErrorIcon(graphics,errorText);

}

}

}

用法如下

[VB.NET]

'DataGridViewProgressBarColumnを作成する

Dim pbColumn As New DataGridViewProgressBarColumn()

'データソースの"Column1"をバインドする

pbColumn.DataPropertyName = "Column1"

'列を追加する

DataGridView1.Columns.Add(pbColumn)

[C#]

//DataGridViewProgressBarColumnを作成する

DataGridViewProgressBarColumn pbColumn =

new DataGridViewProgressBarColumn();

//データソースの"Column1"をバインドする

pbColumn.DataPropertyName = "Column1";

//列を追加する

DataGridView1.Columns.Add(pbColumn);

58. DataGridView中添加MaskedTextBox

[VB.NET]

Imports System

Imports System.Windows.Forms

''' <summary>

''' DataGridViewMaskedTextBoxCellオブジェクトの列を表します。

''' </summary>

Public Class DataGridViewMaskedTextBoxColumn

Inherits DataGridViewColumn

'CellTemplateとするDataGridViewMaskedTextBoxCellオブジェクトを指定して

'基本クラスのコンストラクタを呼び出す

Public Sub New()

MyBase.New(New DataGridViewMaskedTextBoxCell())

End Sub

Private maskValue As String = ""

''' <summary>

''' MaskedTextBoxのMaskプロパティに適用する値

''' </summary>

Public Property Mask() As String

Get

Return Me.maskValue

End Get

Set(ByVal value As String)

Me.maskValue = value

End Set

End Property

'新しいプロパティを追加しているため、

' Cloneメソッドをオーバーライドする必要がある

Public Overrides Function Clone() As Object

Dim col As DataGridViewMaskedTextBoxColumn = _

CType(MyBase.Clone(),DataGridViewMaskedTextBoxColumn)

col.Mask = Me.Mask

Return col

End Function

'CellTemplateの取得と設定

Public Overrides Property CellTemplate() As DataGridViewCell

Get

Return MyBase.CellTemplate

End Get

Set(ByVal value As DataGridViewCell)

'DataGridViewMaskedTextBoxCellしか

' CellTemplateに設定できないようにする

If Not TypeOf value Is DataGridViewMaskedTextBoxCell Then

Throw New InvalidCastException( _

"DataGridViewMaskedTextBoxCellオブジェクトを" + _

"指定してください。")

End If

MyBase.CellTemplate = value

End Set

End Property

End Class

''' <summary>

''' MaskedTextBoxで編集できるテキスト情報を

''' DataGridViewコントロールに表示します。

''' </summary>

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 = _

Me.DataGridView.EditingControl

If Not (maskedBox Is Nothing) Then

'Textを設定

maskedBox.Text = IIf(Me.Value Is Nothing,"",Me.Value.ToString())

'カスタム列のプロパティを反映させる

Dim column As DataGridViewMaskedTextBoxColumn = Me.OwningColumn

If Not (column Is 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

'セルの値のデータ型を指定する

'ここでは、Object型とする

'基本クラスと同じなので、オーバーライドの必要なし

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

''' <summary>

''' DataGridViewMaskedTextBoxCellでホストされる

''' MaskedTextBoxコントロールを表します。

''' </summary>

Public Class DataGridViewMaskedTextBoxEditingControl

Inherits MaskedTextBox

Implements IDataGridViewEditingControl

'編集コントロールが表示されているDataGridView

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 = CStr(value)

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

Case DataGridViewContentAlignment.BottomRight,_

DataGridViewContentAlignment.MiddleRight,_

DataGridViewContentAlignment.TopRight

Me.TextAlign = HorizontalAlignment.Right

Case Else

Me.TextAlign = HorizontalAlignment.Left

End Select

End Sub

'編集するセルがあるDataGridView

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

'指定されたキーをDataGridViewが処理するか、編集コントロールが処理するか

'Trueを返すと、編集コントロールが処理する

'dataGridViewWantsInputKeyがTrueの時は、DataGridViewが処理できる

Public Function EditingControlWantsInputKey(ByVal keyData As Keys,_

ByVal dataGridViewWantsInputKey As Boolean) As Boolean _

Implements IDataGridViewEditingControl.EditingControlWantsInputKey

'Keys.Left、Right、Home、Endの時は、Trueを返す

'このようにしないと、これらのキーで別のセルにフォーカスが移ってしまう

Select Case keyData And Keys.KeyCode

Case Keys.Right,Keys.End,Keys.Left,Keys.Home

Return True

Case Else

Return False

End Select

End Function

'マウスカーソルがEditingPanel上にあるときのカーソルを指定する

'EditingPanelは編集コントロールをホストするパネルで、

'編集コントロールがセルより小さいとコントロール以外の部分がパネルとなる

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

'値が変更した時に、セルの位置を変更するかどうか

'値が変更された時に編集コントロールの大きさが変更される時はTrue

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)

'値が変更されたことをDataGridViewに通知する

Me.valueChanged = True

Me.dataGridView.NotifyCurrentCellDirty(True)

End Sub

End Class

[C#]

using System;

using System.Windows.Forms;

/// <summary>

/// DataGridViewMaskedTextBoxCellオブジェクトの列を表します。

/// </summary>

public class DataGridViewMaskedTextBoxColumn :

DataGridViewColumn

{

//CellTemplateとするDataGridViewMaskedTextBoxCellオブジェクトを指定して

//基本クラスのコンストラクタを呼び出す

public DataGridViewMaskedTextBoxColumn()

: base(new DataGridViewMaskedTextBoxCell())

{

}

private string maskValue = "";

/// <summary>

/// MaskedTextBoxのMaskプロパティに適用する値

/// </summary>

public string Mask

{

get

{

return this.maskValue;

}

set

{

this.maskValue = value;

}

}

//新しいプロパティを追加しているため、

// Cloneメソッドをオーバーライドする必要がある

public override object Clone()

{

DataGridViewMaskedTextBoxColumn col =

(DataGridViewMaskedTextBoxColumn)base.Clone();

col.Mask = this.Mask;

return col;

}

//CellTemplateの取得と設定

public override DataGridViewCell CellTemplate

{

get

{

return base.CellTemplate;

}

set

{

//DataGridViewMaskedTextBoxCellしか

// CellTemplateに設定できないようにする

if (!(value is DataGridViewMaskedTextBoxCell))

{

throw new InvalidCastException(

"DataGridViewMaskedTextBoxCellオブジェクトを" +

"指定してください。");

}

base.CellTemplate = value;

}

}

}

/// <summary>

/// MaskedTextBoxで編集できるテキスト情報を

/// DataGridViewコントロールに表示します。

/// </summary>

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)

{

//Textを設定

maskedBox.Text =

this.Value != null ? this.Value.ToString() : "";

//カスタム列のプロパティを反映させる

DataGridViewMaskedTextBoxColumn column =

this.OwningColumn as DataGridViewMaskedTextBoxColumn;

if (column != null)

{

maskedBox.Mask = column.Mask;

}

}

}

//編集コントロールの型を指定する

public override Type EditType

{

get

{

return typeof(DataGridViewMaskedTextBoxEditingControl);

}

}

//セルの値のデータ型を指定する

//ここでは、Object型とする

//基本クラスと同じなので、オーバーライドの必要なし

public override Type ValueType

{

get

{

return typeof(object);

}

}

//新しいレコード行のセルの既定値を指定する

public override object DefaultNewRowValue

{

get

{

return base.DefaultNewRowValue;

}

}

}

/// <summary>

/// DataGridViewMaskedTextBoxCellでホストされる

/// MaskedTextBoxコントロールを表します。

/// </summary>

public class DataGridViewMaskedTextBoxEditingControl :

MaskedTextBox,IDataGridViewEditingControl

{

//編集コントロールが表示されているDataGridView

DataGridView dataGridView;

//編集コントロールが表示されている行

int rowIndex;

//編集コントロールの値とセルの値が違うかどうか

bool valueChanged;

//コンストラクタ

public DataGridViewMaskedTextBoxEditingControl()

{

this.TabStop = false;

}

#region IDataGridViewEditingControl メンバ

//編集コントロールで変更されたセルの値

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;

}

}

//編集するセルがあるDataGridView

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;

}

}

//指定されたキーをDataGridViewが処理するか、編集コントロールが処理するか

//Trueを返すと、編集コントロールが処理する

//dataGridViewWantsInputKeyがTrueの時は、DataGridViewが処理できる

public bool EditingControlWantsInputKey(

Keys keyData,bool dataGridViewWantsInputKey)

{

//Keys.Left、Right、Home、Endの時は、Trueを返す

//このようにしないと、これらのキーで別のセルにフォーカスが移ってしまう

switch (keyData & Keys.KeyCode)

{

case Keys.Right:

case Keys.End:

case Keys.Left:

case Keys.Home:

return true;

default:

return false;

}

}

//マウスカーソルがEditingPanel上にあるときのカーソルを指定する

//EditingPanelは編集コントロールをホストするパネルで、

//編集コントロールがセルより小さいとコントロール以外の部分がパネルとなる

public Cursor EditingPanelCursor

{

get

{

return base.Cursor;

}

}

//コントロールで編集する準備をする

//テキストを選択状態にしたり、挿入ポインタを末尾にしたりする

public void PrepareEditingControlForEdit(bool selectAll)

{

if (selectAll)

{

//選択状態にする

this.SelectAll();

}

else

{

//挿入ポインタを末尾にする

this.SelectionStart = this.TextLength;

}

}

//値が変更した時に、セルの位置を変更するかどうか

//値が変更された時に編集コントロールの大きさが変更される時はTrue

public bool RepositionEditingControlOnValueChange

{

get

{

return false;

}

}

#endregion

//値が変更された時

protected override void OnTextChanged(EventArgs e)

{

base.OnTextChanged(e);

//値が変更されたことをDataGridViewに通知する

this.valueChanged = true;

this.dataGridView.NotifyCurrentCellDirty(true);

}

}

用法如下

[VB.NET]

'DataGridViewMaskedTextBoxColumnを作成

Dim maskedColumn As New DataGridViewMaskedTextBoxColumn()

'データソースの"Column1"をバインドする

maskedColumn.DataPropertyName = "Column1"

'MaskedTextBoxのMaskプロパティとなる値を設定する

maskedColumn.Mask = "000"

'DataGridViewに列を追加する

DataGridView1.Columns.Add(maskedColumn)

[C#]

//DataGridViewMaskedTextBoxColumnを作成

DataGridViewMaskedTextBoxColumn maskedColumn =

new DataGridViewMaskedTextBoxColumn();

//データソースの"Column1"をバインドする

maskedColumn.DataPropertyName = "Column1";

//MaskedTextBoxのMaskプロパティとなる値を設定する

maskedColumn.Mask = "000";

//DataGridViewに列を追加する

DataGridView1.Columns.Add(maskedColumn);

[VB.NET]

''' <summary>

''' セルの値により、適当なアイコンを表示する

''' </summary>

Public Class DataGridViewErrorIconColumn

Inherits DataGridViewImageColumn

Public Sub New()

Me.CellTemplate = New DataGridViewErrorIconCell()

Me.ValueType = Me.CellTemplate.ValueType

End Sub

End Class

''' <summary>

''' セルの値により、適当なアイコンを表示する

''' </summary>

Public Class DataGridViewErrorIconCell

Inherits DataGridViewImageCell

Public Sub New()

Me.ValueType = GetType(Integer)

End Sub

Protected Overrides Function GetFormattedValue( _

ByVal value As Object,ByVal rowIndex As Integer,_

ByRef cellStyle As DataGridViewCellStyle,_

ByVal valueTypeConverter As System.ComponentModel.TypeConverter,_

ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter,_

ByVal context As DataGridViewDataErrorContexts) As Object

'値が0の時は情報、1の時は警告、2の時はエラーアイコンを表示する

Select Case CInt(value)

Case 1

Return SystemIcons.Information

Case 2

Return SystemIcons.Warning

Case 3

Return SystemIcons.Error

Case Else

Return Nothing

End Select

End Function

Public Overrides ReadOnly Property DefaultNewRowValue() As Object

Get

Return 0

End Get

End Property

End Class

[C#]

using System;

using System.ComponentModel;

using System.Windows.Forms;

/// <summary>

/// セルの値により、適当なアイコンを表示する

/// </summary>

public class DataGridViewErrorIconColumn : DataGridViewImageColumn

{

public DataGridViewErrorIconColumn()

{

this.CellTemplate = new DataGridViewErrorIconCell();

this.ValueType = this.CellTemplate.ValueType;

}

}

/// <summary>

/// セルの値により、適当なアイコンを表示する

/// </summary>

public class DataGridViewErrorIconCell : DataGridViewImageCell

{

public DataGridViewErrorIconCell()

{

this.ValueType = typeof(int);

}

protected override object GetFormattedValue(

object value,int rowIndex,

ref DataGridViewCellStyle cellStyle,

TypeConverter valueTypeConverter,

TypeConverter formattedValueTypeConverter,

DataGridViewDataErrorContexts context)

{

//値が0の時は情報、1の時は警告、2の時はエラーアイコンを表示する

switch ((int)value)

{

case 1:

return SystemIcons.Information;

case 2:

return SystemIcons.Warning;

case 3:

return SystemIcons.Error;

default:

return null;

}

}

public override object DefaultNewRowValue

{

get

{

return 0;

}

}

}

用法如下

[VB.NET]

'DataGridViewErrorIconColumnを作成

Dim iconColumn As New DataGridViewErrorIconColumn()

'Column1列(整数型)をバインドする

iconColumn.DataPropertyName = "Column1"

'DataGridViewに追加

DataGridView1.Columns.Add(iconColumn)

[C#]

//DataGridViewErrorIconColumnを作成

DataGridViewErrorIconColumn iconColumn =

new DataGridViewErrorIconColumn();

//Column1列(整数型)をバインドする

iconColumn.DataPropertyName = "Column1";

//DataGridViewに追加

DataGridView1.Columns.Add(iconColumn);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")