给你看一段加入combobox的代码
using System;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
namespace CommonLib
{
/// <summary>
/// 装载了ComboBox的DatagridColumnStyle
/// </summary>
public class DataGridComboColumn:System.Windows.Forms.DataGridTextBoxColumn
{
                  //内嵌的combobox控件
private System.Windows.Forms.ComboBox Combo; 
private CurrencyManager Source; //保存管理bingding对象的列表
private int Rownum;      //保存当前编辑的行号
private bool InEdit=false;       //标记是否在编辑状态
public DataGridComboColumn(System.Collections.IList Items,string ValueMember,string DisplayMember)
{
this.Combo=new System.Windows.Forms.ComboBox();
this.Combo.DataSource=Items;
this.Combo.ValueMember=ValueMember;
this.Combo.DisplayMember=DisplayMember;
}
public DataGridComboColumn(object[] items)
{
this.Combo=new System.Windows.Forms.ComboBox();
this.Combo.Items.AddRange(items);
}
//
// 重载方法 Edit Grid 准备单元格以便编辑值
//当在派生类中重写时,请准备一个将要进行编辑的单元格
//通常,Edit 方法将控件定位到网格上要编辑的单元格的位置。

//参数
//1 CurrencyManager Source 管理 Binding 对象的列表。
//2 int Rownum 此列中所编辑的行的行号
//3 Rectangle Bounds          控件将被放置在其中
//4 bool ReadOnly 指示该列是否为只读的列的
                  //值。如果该值是只读,则为 true;否则为 false
//5 string InstantText 控件中将显示的文本。 
//6 bool CellIsVisible 指示该单元格是否可见的值。
                  //如果该单元格可见,则为 true;否则为 false。 protected override void Edit(CurrencyManager Source ,int Rownum,Rectangle Bounds, bool ReadOnly,string InstantText, bool CellIsVisible)
{
base.Edit(Source,Rownum,Bounds,ReadOnly,InstantText,CellIsVisible); if(!ReadOnly)
{
this.TextBox.Controls.Add(this.Combo);
this.Combo.Dock=System.Windows.Forms.DockStyle.Fill;
this.Source=Source;
this.Rownum=Rownum;
if(!this.InEdit)
{
this.Combo.Text=this.TextBox.Text;
}

this.Combo.Enabled=true;
this.Combo.SelectionChangeCommitted+=new System.EventHandler(this.ComboSelected);
this.InEdit=true;
}
else
{
if(this.TextBox.Controls.Contains(this.Combo))
{
this.TextBox.Controls.Remove(this.Combo);
}
}
}
//
// 在派生类中重写时,请启动一个请求来完成编辑过程
//
protected override bool Commit(CurrencyManager DataSource,int RowNum)
{
this.InEdit=false;
return base.Commit(DataSource,RowNum);
}
private void ComboSelected(object sender,System.EventArgs e)
{
if(this.InEdit)
{
if(this.Combo.SelectedValue==null)
{
base.SetColumnValueAtRow(this.Source,this.Rownum,this.Combo.SelectedItem);
}
else
{
base.SetColumnValueAtRow(this.Source,this.Rownum,this.Combo.SelectedValue);
}
base.ColumnStartedEditing(this.Combo);
}
}
}
}