DataGridView自定義列樣式--DataGridViewMaskedTextBoxColumn

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
    }

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

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

    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值