Code mẫu tham khảo:
using System;
using System.Windows.Forms;
/// <summary>
/// Đại diện cho một cột của các đối tượng DataGridViewMaskedTextBoxCell.
/// </summary>
public class DataGridViewMaskedTextBoxColumn : DataGridViewColumn
{
// Chỉ định đối tượng DataGridViewMaskedTextBoxCell làm CellTemplate
// Gọi hàm tạo lớp cơ sở
public DataGridViewMaskedTextBoxColumn()
: base(new DataGridViewMaskedTextBoxCell())
{
}
private string maskValue = "";
/// <summary>
/// Giá trị áp dụng cho thuộc tính Mask của MaskedTextBox
/// </summary>
public string Mask
{
get
{
return this.maskValue;
}
set
{
this.maskValue = value;
}
}
// Vì đang thêm một thuộc tính mới
// cần ghi đè phương thức Clone
public override object Clone()
{
DataGridViewMaskedTextBoxColumn col =
(DataGridViewMaskedTextBoxColumn)base.Clone();
col.Mask = this.Mask;
return col;
}
// Nhận và đặt CellTemplate
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Chỉ DataGridViewMaskedTextBoxCell
// Ngăn không cho nó được đặt trong CellTemplate
if (!(value is DataGridViewMaskedTextBoxCell))
{
throw new InvalidCastException(
"Đối tượng DataGridViewMaskedTextBoxCell" +
"Xin chỉ ra cụ thể");
}
base.CellTemplate = value;
}
}
}
/// <summary>
/// Thông tin văn bản có thể được chỉnh sửa bằng MaskedTextBox
/// Hiển thị trong điều khiển DataGridView.
/// </summary>
public class DataGridViewMaskedTextBoxCell : DataGridViewTextBoxCell
{
// Khởi tạo
public DataGridViewMaskedTextBoxCell()
{
}
// Khởi tạo kiểm soát chỉnh sửa
// Các điều khiển chỉnh sửa được sử dụng lại
// trong các ô và cột khác nhau và cần được khởi tạo
public override void InitializeEditingControl(
int rowIndex, object initialFormattedValue,
DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex,
initialFormattedValue, dataGridViewCellStyle);
// Nhận quyền kiểm soát chỉnh sửa
DataGridViewMaskedTextBoxEditingControl maskedBox =
this.DataGridView.EditingControl as
DataGridViewMaskedTextBoxEditingControl;
if (maskedBox != null)
{
// Đặt văn bản
string maskedText = initialFormattedValue as string;
maskedBox.Text = maskedText != null ? maskedText : "";
// Phản ánh thuộc tính cột tùy chỉnh
DataGridViewMaskedTextBoxColumn column =
this.OwningColumn as DataGridViewMaskedTextBoxColumn;
if (column != null)
{
maskedBox.Mask = column.Mask;
}
}
}
// Chỉ định loại điều khiển chỉnh sửa
public override Type EditType
{
get
{
return typeof(DataGridViewMaskedTextBoxEditingControl);
}
}
// Chỉ định kiểu dữ liệu của giá trị ô
// Đây là một kiểu Đối tượng.
// Giống như lớp cơ sở, vì vậy không cần ghi đè
public override Type ValueType
{
get
{
return typeof(object);
}
}
// Chỉ định giá trị mặc định của ô cho các hàng bản ghi mới
public override object DefaultNewRowValue
{
get
{
return base.DefaultNewRowValue;
}
}
}
/// <summary>
/// Được lưu trữ bởi DataGridViewMaskedTextBoxCell
/// Đại diện cho một điều khiển MaskedTextBox.
/// </summary>
public class DataGridViewMaskedTextBoxEditingControl :
MaskedTextBox, IDataGridViewEditingControl
{
// DataGridView hiển thị các điều khiển chỉnh sửa
DataGridView dataGridView;
// Dòng nơi điều khiển chỉnh sửa được hiển thị
int rowIndex;
// Giá trị của điều khiển chỉnh sửa và giá trị của ô có khác nhau hay không
bool valueChanged;
// Khởi tạo
public DataGridViewMaskedTextBoxEditingControl()
{
this.TabStop = false;
}
#region Thành viên IDataGridViewE EditControl
// Giá trị ô đã thay đổi trong kiểm soát chỉnh sửa
public object GetEditingControlFormattedValue(
DataGridViewDataErrorContexts context)
{
return this.Text;
}
// Giá trị ô đã thay đổi trong kiểm soát chỉnh sửa
public object EditingControlFormattedValue
{
get
{
return this.GetEditingControlFormattedValue(
DataGridViewDataErrorContexts.Formatting);
}
set
{
this.Text = (string)value;
}
}
// Áp dụng kiểu ô để chỉnh sửa điều khiển
// Khớp màu nền trước, màu nền, phông chữ, v.v. của điều khiển chỉnh sửa với kiểu ô
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 với các ô để chỉnh sửa
public DataGridView EditingControlDataGridView
{
get
{
return this.dataGridView;
}
set
{
this.dataGridView = value;
}
}
// Chỉ mục của hàng đang chỉnh sửa
public int EditingControlRowIndex
{
get
{
return this.rowIndex;
}
set
{
this.rowIndex = value;
}
}
// Giá trị có thay đổi hay không
// Giá trị của điều khiển chỉnh sửa và giá trị của ô có khác nhau hay không
public bool EditingControlValueChanged
{
get
{
return this.valueChanged;
}
set
{
this.valueChanged = value;
}
}
// DataGridView xử lý khóa được chỉ định hay điều khiển chỉnh sửa xử lý khóa đó
// Nếu true được trả về, điều khiển chỉnh sửa sẽ xử lý nó
// Khi dataGridViewWantsInputKey là true, DataGridView có thể xử lý
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
// Trả về True cho các phím: Left, Right, Home, End
// Nếu không, các phím này sẽ chuyển tiêu điểm sang ô khác.
switch (keyData & Keys.KeyCode)
{
case Keys.Right:
case Keys.End:
case Keys.Left:
case Keys.Home:
return true;
default:
return !dataGridViewWantsInputKey;
}
}
// Chỉ định con trỏ khi con trỏ chuột ở trên Bảng chỉnh sửa
// Bảng chỉnh sửa là bảng lưu trữ các điều khiển chỉnh sửa.
// Nếu điều khiển chỉnh sửa nhỏ hơn ô,
// phần không phải điều khiển sẽ trở thành bảng điều khiển
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
// Sẵn sàng chỉnh sửa trong điều khiển
// Chọn văn bản hoặc kết thúc con trỏ chèn
public void PrepareEditingControlForEdit(bool selectAll)
{
if (selectAll)
{
// Chọn nó
this.SelectAll();
}
else
{
// Kết thúc con trỏ chèn
this.SelectionStart = this.TextLength;
}
}
// Có thay đổi vị trí ô khi giá trị thay đổi hay không
// true: nếu điều khiển chỉnh sửa được thay đổi kích thước khi giá trị thay đổi
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}
#endregion
// Khi giá trị thay đổi
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
// Thông báo cho DataGridView rằng giá trị đã thay đổi
this.valueChanged = true;
this.dataGridView.NotifyCurrentCellDirty(true);
}
}