我直接给你C#的罢
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;namespace MyControls
{
/// <summary>
/// DataGridComboBoxColumn 的摘要说明。
/// </summary>
public class DataGridComboBoxColumn : DataGridTextBoxColumn
{
public NoKeyUpCombo ColumnComboBox;
private int m_RowNum;
private bool m_IsEditing;
public static int m_RowCount;
private CurrencyManager m_Source;

/// <summary>
/// 构造器
/// </summary>
public DataGridComboBoxColumn()
{
m_Source = null;
m_IsEditing = false;
m_RowCount = -1;

ColumnComboBox = new NoKeyUpCombo();
ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
ColumnComboBox.Leave += new EventHandler(LeaveComboBox);
ColumnComboBox.Enter += new EventHandler(ComboMadeCurrent);
// ColumnComboBox.SelectionChangeCommitted += new EventHandler(ComboStartEditing);
}

// private void ComboStartEditing(object sender, EventArgs e)
// {
// m_IsEditing = true;
// base.ColumnStartedEditing((Control) sender);
// }
private void ComboMadeCurrent(object sender, EventArgs e)
{
m_IsEditing = true; 
}


private void LeaveComboBox(object sender, EventArgs e)
{
if(m_IsEditing)
{
SetColumnValueAtRow(m_Source,m_RowNum,ColumnComboBox.Text);
m_IsEditing = false;
Invalidate();
}
ColumnComboBox.Hide();
this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(HandleScroll);
}


/// <summary>
/// 拉动DataGrid滚动条时,触发的事件
/// </summary>
private void HandleScroll(object sender, EventArgs e)
{
//拉动DataGrid滚动条时,ComboBox隐藏
if(ColumnComboBox.Visible)
{
ColumnComboBox.Hide();
}
}


/// <summary>
/// 重写Edit方法
/// </summary>
protected override void Edit(CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
base.Edit (source, rowNum, bounds, readOnly, instantText, cellIsVisible);

m_RowNum = rowNum;
m_Source = source;

ColumnComboBox.Parent = this.TextBox.Parent;
ColumnComboBox.Location = this.TextBox.Location;
ColumnComboBox.Size = new Size(this.TextBox.Width,this.TextBox.Height);

//编辑ComboBox时,下拉列表显示当前记录的文本
ColumnComboBox.SelectedIndex = ColumnComboBox.FindStringExact(this.TextBox.Text);
ColumnComboBox.Text= this.TextBox.Text;
this.TextBox.Visible = false;
ColumnComboBox.Visible = true;

//拉动DataGrid滚动条时,触发事件
this.DataGridTableStyle.DataGrid.Scroll += new EventHandler(HandleScroll);

ColumnComboBox.BringToFront();
ColumnComboBox.Focus();
}


protected override bool Commit(CurrencyManager dataSource, int rowNum)
{
if(m_IsEditing)
{
m_IsEditing = false;
SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text);
}
return true;
//return base.Commit (dataSource, rowNum);
}


protected override void SetColumnValueAtRow(CurrencyManager source, int rowNum, object value)
{
DataView dv = (DataView)this.ColumnComboBox.DataSource;
int rowCount = dv.Count;
int i = 0;

while(i < rowCount)
{
if(value.Equals(dv[i][this.ColumnComboBox.DisplayMember]))
break;
++i;
}

if(i < rowCount)
value = dv[i][this.ColumnComboBox.ValueMember];
else
value = DBNull.Value;
base.SetColumnValueAtRow (source, rowNum, value);
}


protected override object GetColumnValueAtRow(CurrencyManager source, int rowNum)
{
object s =  base.GetColumnValueAtRow(source, rowNum);
DataView dv = (DataView)this.ColumnComboBox.DataSource;
int rowCount = dv.Count;
int i = 0;

//if things are slow, you could order your dataview
//& use binary search instead of this linear one
while (i < rowCount)
{
if( s.Equals( dv[i][this.ColumnComboBox.ValueMember]))
break;
++i;
}

if(i < rowCount)
return dv[i][this.ColumnComboBox.DisplayMember];

return DBNull.Value;
//return base.GetColumnValueAtRow (source, rowNum);
}
}
}

解决方案 »

  1.   

    using System;
    using System.Windows.Forms;namespace MyControls
    {
    /// <summary>
    /// NoKeyUpCombo 的摘要说明。
    /// </summary>
    public class NoKeyUpCombo : ComboBox 
    {
    private const int WM_KEYUP = 0x101; /// <summary>
    /// 重写WndProc函数,屏蔽WM_KEYUP
    /// </summary>
    /// <param name="m"></param>
    protected override void WndProc(ref Message m)
    {
    if(m.Msg == WM_KEYUP)
    {
    return;
    }
    base.WndProc (ref m);
    }
    }
    }
      

  2.   

    http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q480q
    这是原文地址,代码下载下来后DataGridBoundComboBox有个小Bug,参照我贴的代码改改就好了。
      

  3.   

    你可以Inherits DataGridColumnStyle 然後綁定 你所需的控件 進行重寫...
    下面是我在我datagrid 中應用Checkbox,ComboBox,dateTimePicker 的例子,C#部分和我VB.net都有,希望對你有幫助....
    VB.net 部分:
    http://blog.csdn.net/zwxrain/archive/2005/01/19/258998.aspxC#部分:
    http://blog.csdn.net/zwxrain/archive/2005/01/19/259100.aspx
      

  4.   

    To kenengjiang(每天赚10分,56401天后超过思归):那个绑定我试过了,不过我觉得没有那个VB写的精炼,不太好封装,因为他们的设计思路不同,那个VB的如果写的好的话,我认为可以绑定好多种控件,不过只是我认为而已,下面C#必定是继承DataGridTextBoxColumn的,希望通用一点的!谢谢
      

  5.   

    利用这个原理也可以绑定其他的控件,比如DatetimePicker,你提供的例子好像是Henry教程的,我觉得他那个功能不强
      

  6.   

    继承DataGridColumnStyle,我还没有研究过,看看现
      

  7.   

    下面是我做的放入DatetimePicker的类
    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Data;namespace MyControls
    {
    /// <summary>
    /// DataGridDatePickColumn 的摘要说明。
    /// </summary>
    public class DataGridDatePickColumn : DataGridTextBoxColumn
    {
    public DateTimePicker ColunmDatePicker;
    private bool m_IsEditing;
    private int m_RowNum;
    public static int m_RowCount;
    private CurrencyManager m_Source; /// <summary>
    /// 构造器
    /// </summary>
    public DataGridDatePickColumn()
    {
    m_Source = null;
    m_RowCount = -1;
    m_IsEditing = false; ColunmDatePicker = new DateTimePicker();
    ColunmDatePicker.Leave +=new EventHandler(ColunmDatePicker_Leave);
    ColunmDatePicker.Enter +=new EventHandler(ColunmDatePicker_Enter);
    }
    /// <summary>
    /// 失去焦点时显示为TextBox
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ColunmDatePicker_Leave(object sender, EventArgs e)
    {
    if(m_IsEditing)
    {
    SetColumnValueAtRow(m_Source,m_RowNum,ColunmDatePicker.Text);
    m_IsEditing = false;
    Invalidate();
    }
    ColunmDatePicker.Hide();
    this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(DataGrid_Scroll);
    }
    /// <summary>
    /// 获得焦点时显示为DatePicker
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ColunmDatePicker_Enter(object sender, EventArgs e)
    {
    m_IsEditing = true;
    }
    protected  override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
    {
    base.Edit (source, rowNum, bounds, readOnly, instantText, cellIsVisible); m_RowNum = rowNum;
    m_Source = source;

    ColunmDatePicker.Parent = this.TextBox.Parent;
    ColunmDatePicker.Location = this.TextBox.Location;
    ColunmDatePicker.Size = new Size(this.TextBox.Width,this.TextBox.Height);

    //编辑DatePicker时,下拉列表显示当前记录的文本
    ColunmDatePicker.Text= this.TextBox.Text;
    this.TextBox.Visible = false;
    ColunmDatePicker.Visible = true;

    //拉动DataGrid滚动条时,触发事件
    this.DataGridTableStyle.DataGrid.Scroll +=new EventHandler(DataGrid_Scroll);

    ColunmDatePicker.BringToFront();
    ColunmDatePicker.Focus();
    }
    private void DataGrid_Scroll(object sender, EventArgs e)
    {
    //拉动DataGrid滚动条时,DatePicker隐藏
    if(ColunmDatePicker.Visible)
    {
    ColunmDatePicker.Hide();
    }
    }
    }//end class
    }//end namespace
      

  8.   

    http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asphttp://blog.csdn.net/zhzuo/archive/2004/05/31/22036.aspx
      

  9.   

    非常强大的DataGrid
    http://www.devexpress.com/Products/NET/XtraGrid/
    可以说比较全了,没有源代码,可以看看设计的思路,直接用也可以