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、付费专栏及课程。

余额充值