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

Loading

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *