编写DataGridView自定义列编辑器(自定义单元格编辑类)

转自生命体验博客

这几年都在web项目上工作和学习,windows的项目也只是windows服务,界面上的学习少了。这几天看了看DataGridView,跟.net1.1的差别还是很大。实现自定义单元格编辑类的方式也不同了。主要是通过实现自己的DataGridViewColumn

微软有一篇文章

如何:在 Windows 窗体 DataGridView 单元格中承载控件


主要几步:

1。创建自己的DataGridViewColumn,重写

public   override  DataGridViewCell CellTemplate
{
      
get ;  
      
set ;
}
 

2.创建自己的DataGridViewCell,用作上面的类返回的DataGridViewCell。重写

public   override  Type EditType
{
    
get  ;
}

public   override  Type ValueType
{
    
get ;
}


3.创建自己的EditType,该类需要实现System.Windows.Forms.IDataGridViewEditingControl接口

class  DataGridViewDecimalTextBoxEditingControl : TextBox, IDataGridViewEditingControl
{
// ...一般让EditingControl继承自现有的控件或自己编写的windows自定义控件。
}


以下是一个完整的例子

 public   class  DataGridViewMoneyTextBoxColumn : DataGridViewTextBoxColumn
    {
        
public  DataGridViewMoneyTextBoxColumn()
        {
            
this .CellTemplate  =   new  DataGridViewMoneyCell();           
        }
        
public   override  DataGridViewCell CellTemplate
        {
            
get
            {
                
return   base .CellTemplate;
            }
            
set
            {
                DataGridViewMoneyCell cell 
=  value  as  DataGridViewMoneyCell;
                
if  (value  !=   null   &&  cell  ==   null )
                {
                    
throw   new  InvalidCastException( " Value provided for CellTemplate must be of type TEditNumDataGridViewCell or derive from it. " );
                }
                
base .CellTemplate  =  value;
            }            
        }
    }

    
public   class  DataGridViewMoneyCell : DataGridViewTextBoxCell
    {
        
public  DataGridViewMoneyCell()
        {
            
        }
        
int  decimalLength;

        
private   static  Type defaultEditType  =   typeof (MoneyTextBoxDataGridViewEditingControl);
        
private   static  Type defaultValueType  =   typeof (System.Decimal);

        
public   int  DecimalLength
        {
            
get  {  return  decimalLength; }
            
set  { decimalLength  =  value; }
        }

        
public   override  Type EditType
        {
            
get  {  return  defaultEditType; }
        }

        
public   override  Type ValueType
        {
            
get
            {
                Type valueType 
=   base .ValueType;
                
if  (valueType  !=   null )
                {
                    
return  valueType;
                }
                
return  defaultValueType;
            }
        }
   }
    
public   class  MoneyTextBoxDataGridViewEditingControl : TextBox, IDataGridViewEditingControl
    {
        
private  DataGridView dataGridView;   //  grid owning this editing control
         private   bool  valueChanged;   //  editing control's value has changed or not
         private   int  rowIndex;   //   row index in which the editing control resides

        
#region  IDataGridViewEditingControl 成员

        
public   void  ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            
this .Font  =  dataGridViewCellStyle.Font;
            
if  (dataGridViewCellStyle.BackColor.A  <   255 )
            {
                
//  The NumericUpDown control does not support transparent back colors
                Color opaqueBackColor  =  Color.FromArgb( 255 , dataGridViewCellStyle.BackColor);
                
this .BackColor  =  opaqueBackColor;
                
this .dataGridView.EditingPanel.BackColor  =  opaqueBackColor;
            }
            
else
            {
                
this .BackColor  =  dataGridViewCellStyle.BackColor;
            }
            
this .ForeColor  =  dataGridViewCellStyle.ForeColor;
        }

        
public  DataGridView EditingControlDataGridView
        {
            
get
            {
                
return   this .dataGridView; 
            }
            
set
            {
                
this .dataGridView  =  value;
            }
        }

        
public   object  EditingControlFormattedValue
        {
            
get
            {
                
return  GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
            }
            
set
            {
                
this .Text  =  ( string )value;
            }
        }

        
public   int  EditingControlRowIndex
        {
            
get
            {
                
return   this .rowIndex;
            }
            
set
            {
                
this .rowIndex  =  value;
            }
        }

        
public   bool  EditingControlValueChanged
        {
            
get  {  return   this .valueChanged; }
            
set  {  this .valueChanged  =  value; }
        }

        
public   bool  EditingControlWantsInputKey(Keys keyData,  bool  dataGridViewWantsInputKey)
        {
            
switch  (keyData  &  Keys.KeyCode)
            {
                
case  Keys.Right:
                
case  Keys.Left:
                
case  Keys.Down:
                
case  Keys.Up:
                
case  Keys.Home:
                
case  Keys.End:
                
case  Keys.Delete:
                    
return   true ;
            }
            
return   ! dataGridViewWantsInputKey;
        }

        
public  Cursor EditingPanelCursor
        {
            
get  {  return  Cursors.Default; }
        }

        
public   object  GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            
return   this .Text;
        }

        
public   void  PrepareEditingControlForEdit( bool  selectAll)
        {
            
if  (selectAll)
            {
                
this .SelectAll();
            }
            
else
            {
                
this .SelectionStart  =   this .Text.Length;
            }
        }

        
public   bool  RepositionEditingControlOnValueChange
        {
            
get  {  return   false ; }
        }

        
#endregion
    }

生成项目,如果是控件类库,引用到你的windows程序里,你就能从DataGridView编辑列里找到我们定义的DataGridViewColumn:DataGridViewTextBoxColumn


直白的说,就是第一步定义类把第二步的Cell类暴露给DataGridView,第二步的Cell类把我自己希望的编辑的控件暴露给DataGridView,当Cell被选中并处于编辑状态时,我们定义的控件就会被创建并显示给用户。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值