1.編寫DataGridViewMaskedTextBoxEditingControl類
public
class
DataGridViewMaskedTextBoxEditingControl : MaskedTextBox, IDataGridViewEditingControl
{
protected int rowIndex;
protected DataGridView dataGridView;
protected bool valueChanged = false ;
public DataGridViewMaskedTextBoxEditingControl()
{
base .TabStop = false ;
}
// 重寫基類(MakedTextBox)的OnTextChanged方法
protected override void OnTextChanged(EventArgs e)
{
base .OnTextChanged(e);
NotifyDataGridViewOfValueChange();
}
// 當text值發生變化時,通知DataGridView
private void NotifyDataGridViewOfValueChange()
{
valueChanged = true ;
dataGridView.NotifyCurrentCellDirty( true );
}
/// <summary>
/// 設置對齊方式
/// </summary>
/// <param name="align"></param>
/// <returns></returns>
private static HorizontalAlignment translateAlignment(DataGridViewContentAlignment align)
{
switch (align)
{
case DataGridViewContentAlignment.TopLeft:
case DataGridViewContentAlignment.MiddleLeft:
case DataGridViewContentAlignment.BottomLeft:
return HorizontalAlignment.Left;
case DataGridViewContentAlignment.TopCenter:
case DataGridViewContentAlignment.MiddleCenter:
case DataGridViewContentAlignment.BottomCenter:
return HorizontalAlignment.Center;
case DataGridViewContentAlignment.TopRight:
case DataGridViewContentAlignment.MiddleRight:
case DataGridViewContentAlignment.BottomRight:
return HorizontalAlignment.Right;
}
return HorizontalAlignment.Left;
}
#region IDataGridViewEditingControl接口的實現
/// <summary>
/// 在Cell被編輯的時候光標顯示
/// </summary>
public Cursor EditingPanelCursor
{
get
{
return Cursors.IBeam;
}
}
/// <summary>
/// 獲取或設置所在的DataGridView
/// </summary>
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
/// <summary>
/// 獲取或設置格式化後的值
/// </summary>
public object EditingControlFormattedValue
{
set
{
Text = value.ToString();
NotifyDataGridViewOfValueChange();
}
get
{
return this .Text;
}
}
public virtual bool RepositionEditingControlOnValueChange
{
get
{
return false ;
}
}
/// <summary>
/// 控件所在行
/// </summary>
public int EditingControlRowIndex
{
get
{
return this .rowIndex;
}
set
{
this .rowIndex = value;
}
}
/// <summary>
/// 是否值發生了變化
/// </summary>
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
this .valueChanged = value;
}
}
/// <summary>
/// 獲取控件的Text值
/// </summary>
/// <param name="context"> 錯誤上下文 </param>
/// <returns></returns>
public virtual object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return Text;
}
/// <summary>
/// 編輯鍵盤
/// </summary>
/// <param name="keyData"></param>
/// <param name="dataGridViewWantsInputKey"></param>
/// <returns></returns>
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Right:
if ( ! ( this .SelectionLength == 0
&& this .SelectionStart == this .ToString().Length))
{
return true ;
}
break ;
case Keys.Left:
if ( ! ( this .SelectionLength == 0
&& this .SelectionStart == 0 ))
{
return true ;
}
break ;
case Keys.Home:
case Keys.End:
if ( this .SelectionLength != this .ToString().Length)
{
return true ;
}
break ;
case Keys.Prior:
case Keys.Next:
if ( this .valueChanged)
{
return true ;
}
break ;
case Keys.Delete:
if ( this .SelectionLength > 0 || this .SelectionStart < this .ToString().Length)
{
return true ;
}
break ;
}
return ! dataGridViewWantsInputKey;
}
public void PrepareEditingControlForEdit( bool selectAll)
{
if (selectAll)
{
SelectAll();
}
else
{
this .SelectionStart = this .ToString().Length;
}
}
/// <summary>
/// 變更控制項的使用者介面 (UI),使其與指定的儲存格樣式一致。
/// </summary>
/// <param name="dataGridViewCellStyle"></param>
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this .Font = dataGridViewCellStyle.Font;
this .ForeColor = dataGridViewCellStyle.ForeColor;
this .BackColor = dataGridViewCellStyle.BackColor;
this .TextAlign = translateAlignment(dataGridViewCellStyle.Alignment);
}
#endregion
}
{
protected int rowIndex;
protected DataGridView dataGridView;
protected bool valueChanged = false ;
public DataGridViewMaskedTextBoxEditingControl()
{
base .TabStop = false ;
}
// 重寫基類(MakedTextBox)的OnTextChanged方法
protected override void OnTextChanged(EventArgs e)
{
base .OnTextChanged(e);
NotifyDataGridViewOfValueChange();
}
// 當text值發生變化時,通知DataGridView
private void NotifyDataGridViewOfValueChange()
{
valueChanged = true ;
dataGridView.NotifyCurrentCellDirty( true );
}
/// <summary>
/// 設置對齊方式
/// </summary>
/// <param name="align"></param>
/// <returns></returns>
private static HorizontalAlignment translateAlignment(DataGridViewContentAlignment align)
{
switch (align)
{
case DataGridViewContentAlignment.TopLeft:
case DataGridViewContentAlignment.MiddleLeft:
case DataGridViewContentAlignment.BottomLeft:
return HorizontalAlignment.Left;
case DataGridViewContentAlignment.TopCenter:
case DataGridViewContentAlignment.MiddleCenter:
case DataGridViewContentAlignment.BottomCenter:
return HorizontalAlignment.Center;
case DataGridViewContentAlignment.TopRight:
case DataGridViewContentAlignment.MiddleRight:
case DataGridViewContentAlignment.BottomRight:
return HorizontalAlignment.Right;
}
return HorizontalAlignment.Left;
}
#region IDataGridViewEditingControl接口的實現
/// <summary>
/// 在Cell被編輯的時候光標顯示
/// </summary>
public Cursor EditingPanelCursor
{
get
{
return Cursors.IBeam;
}
}
/// <summary>
/// 獲取或設置所在的DataGridView
/// </summary>
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
/// <summary>
/// 獲取或設置格式化後的值
/// </summary>
public object EditingControlFormattedValue
{
set
{
Text = value.ToString();
NotifyDataGridViewOfValueChange();
}
get
{
return this .Text;
}
}
public virtual bool RepositionEditingControlOnValueChange
{
get
{
return false ;
}
}
/// <summary>
/// 控件所在行
/// </summary>
public int EditingControlRowIndex
{
get
{
return this .rowIndex;
}
set
{
this .rowIndex = value;
}
}
/// <summary>
/// 是否值發生了變化
/// </summary>
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
this .valueChanged = value;
}
}
/// <summary>
/// 獲取控件的Text值
/// </summary>
/// <param name="context"> 錯誤上下文 </param>
/// <returns></returns>
public virtual object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return Text;
}
/// <summary>
/// 編輯鍵盤
/// </summary>
/// <param name="keyData"></param>
/// <param name="dataGridViewWantsInputKey"></param>
/// <returns></returns>
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Right:
if ( ! ( this .SelectionLength == 0
&& this .SelectionStart == this .ToString().Length))
{
return true ;
}
break ;
case Keys.Left:
if ( ! ( this .SelectionLength == 0
&& this .SelectionStart == 0 ))
{
return true ;
}
break ;
case Keys.Home:
case Keys.End:
if ( this .SelectionLength != this .ToString().Length)
{
return true ;
}
break ;
case Keys.Prior:
case Keys.Next:
if ( this .valueChanged)
{
return true ;
}
break ;
case Keys.Delete:
if ( this .SelectionLength > 0 || this .SelectionStart < this .ToString().Length)
{
return true ;
}
break ;
}
return ! dataGridViewWantsInputKey;
}
public void PrepareEditingControlForEdit( bool selectAll)
{
if (selectAll)
{
SelectAll();
}
else
{
this .SelectionStart = this .ToString().Length;
}
}
/// <summary>
/// 變更控制項的使用者介面 (UI),使其與指定的儲存格樣式一致。
/// </summary>
/// <param name="dataGridViewCellStyle"></param>
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this .Font = dataGridViewCellStyle.Font;
this .ForeColor = dataGridViewCellStyle.ForeColor;
this .BackColor = dataGridViewCellStyle.BackColor;
this .TextAlign = translateAlignment(dataGridViewCellStyle.Alignment);
}
#endregion
}
2.編寫DataGridViewMaskedTextBoxCell類
public
class
DataGridViewMaskedTextBoxCell : DataGridViewTextBoxCell
{
private string mask;
private char promptChar = ' _ ' ;
private MaskFormat textMaskFormat = MaskFormat.IncludeLiterals;
public DataGridViewMaskedTextBoxCell() : base ()
{
}
/// <summary>
/// 編輯在用戶編輯單元格時
/// </summary>
/// <param name="rowIndex"> 當前行 </param>
/// <param name="initialFormattedValue"> 值 </param>
/// <param name="dataGridViewCellStyle"> Cell樣式 </param>
public override void InitializeEditingControl( int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base .InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
DataGridViewMaskedTextBoxEditingControl maskedTextBoxEditing = DataGridView.EditingControl as DataGridViewMaskedTextBoxEditingControl;
//
// 設置MaskedTextBox特性
//
DataGridViewColumn dgvColumn = this .OwningColumn;
if (dgvColumn is DataGridViewMaskedTextBoxColumn)
{
DataGridViewMaskedTextBoxColumn maskedTextBoxColumn = dgvColumn as DataGridViewMaskedTextBoxColumn;
//
// 設定Mask
//
if ( string .IsNullOrEmpty( this .mask))
{
maskedTextBoxEditing.Mask = maskedTextBoxColumn.Mask;
}
else
{
maskedTextBoxEditing.Mask = this .mask;
}
//
// 設定分割符PromptChar
//
maskedTextBoxEditing.PromptChar = this .PromptChar;
//
// 設定TextMaskFormat
//
maskedTextBoxEditing.TextMaskFormat = this .TextMaskFormat;
//
// 設定ValidatingType
//
if ( this .ValueType == null )
{
maskedTextBoxEditing.ValidatingType = maskedTextBoxColumn.ValueType;
}
else
{
maskedTextBoxEditing.ValidatingType = this .ValueType;
}
//
// 設定Text
//
maskedTextBoxEditing.Text = Convert.ToString( this .Value);
}
}
/// <summary>
/// 設置編輯狀態單元格類型
/// </summary>
public override Type EditType
{
get
{
return typeof (DataGridViewMaskedTextBoxEditingControl);
}
}
/// <summary>
/// 正則表達式
/// </summary>
public virtual string Mask
{
get
{
return this .mask;
}
set
{
this .mask = value;
}
}
/// <summary>
/// 用戶輸入分割符
/// </summary>
public virtual char PromptChar
{
get
{
return this .promptChar;
}
set
{
this .promptChar = value;
}
}
public virtual MaskFormat TextMaskFormat
{
get
{
return this .textMaskFormat;
}
set
{
this .textMaskFormat = value;
}
}
protected static bool BoolFromTri(DataGridViewTriState tri)
{
return (tri == DataGridViewTriState.True) ? true : false ;
}
}
{
private string mask;
private char promptChar = ' _ ' ;
private MaskFormat textMaskFormat = MaskFormat.IncludeLiterals;
public DataGridViewMaskedTextBoxCell() : base ()
{
}
/// <summary>
/// 編輯在用戶編輯單元格時
/// </summary>
/// <param name="rowIndex"> 當前行 </param>
/// <param name="initialFormattedValue"> 值 </param>
/// <param name="dataGridViewCellStyle"> Cell樣式 </param>
public override void InitializeEditingControl( int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base .InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
DataGridViewMaskedTextBoxEditingControl maskedTextBoxEditing = DataGridView.EditingControl as DataGridViewMaskedTextBoxEditingControl;
//
// 設置MaskedTextBox特性
//
DataGridViewColumn dgvColumn = this .OwningColumn;
if (dgvColumn is DataGridViewMaskedTextBoxColumn)
{
DataGridViewMaskedTextBoxColumn maskedTextBoxColumn = dgvColumn as DataGridViewMaskedTextBoxColumn;
//
// 設定Mask
//
if ( string .IsNullOrEmpty( this .mask))
{
maskedTextBoxEditing.Mask = maskedTextBoxColumn.Mask;
}
else
{
maskedTextBoxEditing.Mask = this .mask;
}
//
// 設定分割符PromptChar
//
maskedTextBoxEditing.PromptChar = this .PromptChar;
//
// 設定TextMaskFormat
//
maskedTextBoxEditing.TextMaskFormat = this .TextMaskFormat;
//
// 設定ValidatingType
//
if ( this .ValueType == null )
{
maskedTextBoxEditing.ValidatingType = maskedTextBoxColumn.ValueType;
}
else
{
maskedTextBoxEditing.ValidatingType = this .ValueType;
}
//
// 設定Text
//
maskedTextBoxEditing.Text = Convert.ToString( this .Value);
}
}
/// <summary>
/// 設置編輯狀態單元格類型
/// </summary>
public override Type EditType
{
get
{
return typeof (DataGridViewMaskedTextBoxEditingControl);
}
}
/// <summary>
/// 正則表達式
/// </summary>
public virtual string Mask
{
get
{
return this .mask;
}
set
{
this .mask = value;
}
}
/// <summary>
/// 用戶輸入分割符
/// </summary>
public virtual char PromptChar
{
get
{
return this .promptChar;
}
set
{
this .promptChar = value;
}
}
public virtual MaskFormat TextMaskFormat
{
get
{
return this .textMaskFormat;
}
set
{
this .textMaskFormat = value;
}
}
protected static bool BoolFromTri(DataGridViewTriState tri)
{
return (tri == DataGridViewTriState.True) ? true : false ;
}
}
3.編寫DataGridViewMaskedTextBoxColumn
[ToolboxBitmap(
typeof
(DataGridViewTextBoxColumn),
"
DataGridViewTextBoxColumn.bmp
"
)]
public class DataGridViewMaskedTextBoxColumn : DataGridViewColumn
{
private string mask;
private char promptChar;
private MaskFormat textMaskFormat;
/// <summary>
/// 實粒化一個Masked對像
/// </summary>
public DataGridViewMaskedTextBoxColumn()
: base ( new DataGridViewMaskedTextBoxCell())
{
}
private static DataGridViewTriState TriBool( bool value)
{
return value ? DataGridViewTriState.True : DataGridViewTriState.False;
}
/// <summary>
/// Cell模版
/// </summary>
public override DataGridViewCell CellTemplate
{
get
{
return base .CellTemplate;
}
set
{
if (value != null && ! value.GetType().IsAssignableFrom( typeof (DataGridViewMaskedTextBoxCell)))
{
throw new InvalidCastException( " 類型不屬於DataGridViewMaskedTextBoxCell " );
}
base .CellTemplate = value;
}
}
public override object Clone()
{
DataGridViewMaskedTextBoxColumn col = (DataGridViewMaskedTextBoxColumn) base .Clone();
col.Mask = this .mask;
col.PromptChar = this .promptChar;
col.TextMaskFormat = this .textMaskFormat;
return col;
}
/// <summary>
/// 設置正則
/// </summary>
public string Mask
{
get
{
return this .mask;
}
set
{
if ( this .mask != value)
{
this .mask = value;
DataGridViewMaskedTextBoxCell maskedTextBoxCell = (DataGridViewMaskedTextBoxCell) this .CellTemplate;
maskedTextBoxCell.Mask = value;
//
// 把其他行的Cell的Mask屬性更新
//
if ( this .DataGridView != null && this .DataGridView.Rows != null )
{
int rowCount = this .DataGridView.Rows.Count;
for ( int x = 0 ; x < rowCount; x ++ )
{
DataGridViewCell dataGridViewCell = this .DataGridView.Rows.SharedRow(x).Cells[x];
if (dataGridViewCell is DataGridViewMaskedTextBoxCell)
{
maskedTextBoxCell = (DataGridViewMaskedTextBoxCell)dataGridViewCell;
maskedTextBoxCell.Mask = value;
}
}
}
}
}
}
public virtual char PromptChar
{
get
{
return this .promptChar;
}
set
{
if ( this .promptChar != value)
{
this .promptChar = value;
DataGridViewMaskedTextBoxCell maskedTextBoxCell = (DataGridViewMaskedTextBoxCell) this .CellTemplate;
maskedTextBoxCell.PromptChar = value;
if ( this .DataGridView != null && this .DataGridView.Rows != null )
{
int rowCount = this .DataGridView.Rows.Count;
for ( int x = 0 ; x < rowCount; x ++ )
{
DataGridViewCell dataGridViewCell = this .DataGridView.Rows.SharedRow(x).Cells[x];
if (dataGridViewCell is DataGridViewMaskedTextBoxCell)
{
maskedTextBoxCell = (DataGridViewMaskedTextBoxCell)dataGridViewCell;
maskedTextBoxCell.PromptChar = value;
}
}
}
}
}
}
public virtual MaskFormat TextMaskFormat
{
get
{
return this .textMaskFormat;
}
set
{
if ( this .textMaskFormat != value)
{
this .textMaskFormat = value;
DataGridViewMaskedTextBoxCell maskedTextBoxCell = (DataGridViewMaskedTextBoxCell) this .CellTemplate;
maskedTextBoxCell.TextMaskFormat = value;
if ( this .DataGridView != null && this .DataGridView.Rows != null )
{
int rowCount = this .DataGridView.Rows.Count;
for ( int x = 0 ; x < rowCount; x ++ )
{
DataGridViewCell dataGridViewCell = this .DataGridView.Rows.SharedRow(x).Cells[x];
if (dataGridViewCell is DataGridViewMaskedTextBoxCell)
{
maskedTextBoxCell = (DataGridViewMaskedTextBoxCell)dataGridViewCell;
maskedTextBoxCell.TextMaskFormat = value;
}
}
}
}
}
}
}
public class DataGridViewMaskedTextBoxColumn : DataGridViewColumn
{
private string mask;
private char promptChar;
private MaskFormat textMaskFormat;
/// <summary>
/// 實粒化一個Masked對像
/// </summary>
public DataGridViewMaskedTextBoxColumn()
: base ( new DataGridViewMaskedTextBoxCell())
{
}
private static DataGridViewTriState TriBool( bool value)
{
return value ? DataGridViewTriState.True : DataGridViewTriState.False;
}
/// <summary>
/// Cell模版
/// </summary>
public override DataGridViewCell CellTemplate
{
get
{
return base .CellTemplate;
}
set
{
if (value != null && ! value.GetType().IsAssignableFrom( typeof (DataGridViewMaskedTextBoxCell)))
{
throw new InvalidCastException( " 類型不屬於DataGridViewMaskedTextBoxCell " );
}
base .CellTemplate = value;
}
}
public override object Clone()
{
DataGridViewMaskedTextBoxColumn col = (DataGridViewMaskedTextBoxColumn) base .Clone();
col.Mask = this .mask;
col.PromptChar = this .promptChar;
col.TextMaskFormat = this .textMaskFormat;
return col;
}
/// <summary>
/// 設置正則
/// </summary>
public string Mask
{
get
{
return this .mask;
}
set
{
if ( this .mask != value)
{
this .mask = value;
DataGridViewMaskedTextBoxCell maskedTextBoxCell = (DataGridViewMaskedTextBoxCell) this .CellTemplate;
maskedTextBoxCell.Mask = value;
//
// 把其他行的Cell的Mask屬性更新
//
if ( this .DataGridView != null && this .DataGridView.Rows != null )
{
int rowCount = this .DataGridView.Rows.Count;
for ( int x = 0 ; x < rowCount; x ++ )
{
DataGridViewCell dataGridViewCell = this .DataGridView.Rows.SharedRow(x).Cells[x];
if (dataGridViewCell is DataGridViewMaskedTextBoxCell)
{
maskedTextBoxCell = (DataGridViewMaskedTextBoxCell)dataGridViewCell;
maskedTextBoxCell.Mask = value;
}
}
}
}
}
}
public virtual char PromptChar
{
get
{
return this .promptChar;
}
set
{
if ( this .promptChar != value)
{
this .promptChar = value;
DataGridViewMaskedTextBoxCell maskedTextBoxCell = (DataGridViewMaskedTextBoxCell) this .CellTemplate;
maskedTextBoxCell.PromptChar = value;
if ( this .DataGridView != null && this .DataGridView.Rows != null )
{
int rowCount = this .DataGridView.Rows.Count;
for ( int x = 0 ; x < rowCount; x ++ )
{
DataGridViewCell dataGridViewCell = this .DataGridView.Rows.SharedRow(x).Cells[x];
if (dataGridViewCell is DataGridViewMaskedTextBoxCell)
{
maskedTextBoxCell = (DataGridViewMaskedTextBoxCell)dataGridViewCell;
maskedTextBoxCell.PromptChar = value;
}
}
}
}
}
}
public virtual MaskFormat TextMaskFormat
{
get
{
return this .textMaskFormat;
}
set
{
if ( this .textMaskFormat != value)
{
this .textMaskFormat = value;
DataGridViewMaskedTextBoxCell maskedTextBoxCell = (DataGridViewMaskedTextBoxCell) this .CellTemplate;
maskedTextBoxCell.TextMaskFormat = value;
if ( this .DataGridView != null && this .DataGridView.Rows != null )
{
int rowCount = this .DataGridView.Rows.Count;
for ( int x = 0 ; x < rowCount; x ++ )
{
DataGridViewCell dataGridViewCell = this .DataGridView.Rows.SharedRow(x).Cells[x];
if (dataGridViewCell is DataGridViewMaskedTextBoxCell)
{
maskedTextBoxCell = (DataGridViewMaskedTextBoxCell)dataGridViewCell;
maskedTextBoxCell.TextMaskFormat = value;
}
}
}
}
}
}
}