在.Net中使用最普遍的表格控件当属DataGrid,初看起来它的功能不强,实际上它是由很多子控件堆砌而成的,如果熟悉其基本事件的处理过程,则可以做出很强大功能的表格控件。
这里是自定义样式列的基类,继承的DataGridTextBoxColumn类 using System; 
 
using System.Collections; 
 using System.ComponentModel; 
 using System.Drawing; 
 using System.Data; 
 using System.Windows.Forms; 
  
 namespace System.Windows.Forms 
 { 
     /** <summary> 
     /// DataGrid自定义列的基类 
     /// </summary> 
     public abstract class DataGridCustomColumn : System.Windows.Forms.DataGridTextBoxColumn 
     { 
         protected Control ctrl; 
         CurrencyManager _source; 
         int _iRowNum; 
  
         public DataGridCustomColumn() 
         { 
         } 
  
         protected void Init() 
         { 
             ctrl.Enter+=new EventHandler(ctrl_Enter); 
             ctrl.Leave+=new EventHandler(ctrl_Leave); 
             ctrl.Visible=false; 
         } 
          
         private void ctrl_Enter(object sender, EventArgs e) 
         { 
             if(ReadOnly) 
             { 
                 Control control=(Control)sender; 
                 control.Visible=false; 
             } 
             this.DataGridTableStyle.DataGrid.Select(this.DataGridTableStyle.DataGrid.CurrentRowIndex); 
  
         } 
  
         private void ctrl_Leave(object sender, EventArgs e) 
         { 
             try 
             { 
                 this.SetColumnValueAtRow(_source,_iRowNum ,Value); 
             } 
             catch{} 
             ctrl.Visible = false; 
         } 
         public virtual object Value 
         { 
             get{return null;} 
             set{} 
         } 
         protected override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) 
         { 
             if (!this.DataGridTableStyle.DataGrid.Controls.Contains(ctrl)) this.DataGridTableStyle.DataGrid.Controls.Add(ctrl); 
             _iRowNum = rowNum; 
             _source  = source; 
             ctrl.Bounds = bounds; 
              
             try 
             { 
                 Value = this.GetColumnValueAtRow(_source, _iRowNum);             
             } 
             catch{} 
             ctrl.Visible = true; 
             ctrl.Focus(); 
         } 
         public Control control 
         { 
             get 
             { 
                 return ctrl; 
             } 
         } 
     } 
 } 
 下拉列表框样式类 
  
 namespace System.Windows.Forms 
 { 
     /** <summary> 
     /// 下拉列表框样式列 
     /// </summary> 
     public class DataGridComboBoxColumn : System.Windows.Forms.DataGridCustomColumn 
     { 
         ComboBox _cbo=new ComboBox(); 
  
         public DataGridComboBoxColumn() 
         { 
             ctrl=_cbo; 
             Init(); 
         } 
         public override object Value 
         { 
             get 
             { 
                 return _cbo.Text; 
             } 
             set 
             { 
                 try 
                 { 
                     _cbo.Text = (string)value; 
                 } 
                 catch{} 
             } 
         } 
         public void FillComboBox(string [] comboList) 
         { 
             _cbo.Items.AddRange(comboList); 
         } 
     } 
 } 日期样式类 
 namespace System.Windows.Forms 
 { 
     /** <summary> 
     /// 时间日期样式列 
     /// </summary> 
     public class DataGridDatetimeColumn: System.Windows.Forms.DataGridCustomColumn 
     { 
         DateTimePicker _dt; 
         public DataGridDatetimeColumn() 
         { 
             _dt=new DateTimePicker(); 
             ctrl=_dt; 
             Init(); 
         } 
         public override object Value 
         { 
             get 
             { 
                 return _dt.Value; 
             } 
             set 
             { 
                 try 
                 { 
                     _dt.Value = (DateTime)value; 
                 } 
                 catch{} 
             } 
         } 
  
     } 
 } 
 其它的样式可以自己继承DataGridCustomColumn类,只需要重写一个基类方法,可谓是最简单的在Datagrid中实现自定义样式列的办法。 
 下面是测试效果的代码 
 public void GridComboBoxSample() 
         { 
             //生成一个DataTable(表) 
             DataTable t = new DataTable("PersonInfo"); 
             t.Columns.Add("Name",typeof(string)); 
             t.Columns.Add("Address",typeof(string)); 
             t.Columns.Add("birthday",typeof(DateTime)); 
             t.Rows.Add(new string[]{"yinzx","China","2000-01-01"}); 
              
             //生成一个DataGridTableStyle(表样式) 
             DataGridTableStyle ts = new DataGridTableStyle(); 
              
             DataGridTextBoxColumn c1 = new DataGridTextBoxColumn(); 
             DataGridComboBoxColumn c2 = new DataGridComboBoxColumn();   
             DataGridDatetimeColumn c3=new DataGridDatetimeColumn(); 
             c1.MappingName = c1.HeaderText  = "Name"; 
             c2.MappingName = c2.HeaderText  = "Address"; 
             c3.MappingName=c3.HeaderText="birthday"; 
             c2.FillComboBox(new string[]{"China","Canada","France"}); 
             ts.MappingName = "PersonInfo"; 
             ts.GridColumnStyles.Add(c1); 
             ts.GridColumnStyles.Add(c2); 
             ts.GridColumnStyles.Add(c3); 
              
             //把表及表样式绑定到grd上 
             dataGrid1.TableStyles.Add(ts); 
             dataGrid1.DataSource = t; 
 }
 注:把ReadOnly属性设置为真,可以实现VB中MSHFlex中的整行选择的效果。 
本文参考了网上流行的增加下拉列表框的代码,因被转载的次数太多,无法得知原作者,在这里向原作者致歉。 注:把ReadOnly属性设置为真,可以实现VB中MSHFlex中的整行选择的效果。本文参考了网上流行的增加下拉列表框的代码,因被转载的次数太多,无法得知原作者,在这里向原作者致歉。 
  
 
 
                     
            
        













 
                    

 
                 
                    