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;
}
}
}
}
}
}
}