想写一个DataGridViewComboColumn的派生类, 测试时总是出错: datagridViewComboCell值无效.
出错在哪一行也不知道. 只好请高手给看看了.代码比较长,不过基本是依照MSDN上的CalendarColumn范例改的. 没有什么特别之处. public class Cmb : ComboBox
{
    // Methods
    public Cmb();

public class CmbColumn : DataGridViewColumn
{
    // Fields
    private string mDataMember;
    private object mDataSource;
    private string mDisplayMember;
    private string mValueMember;    // Methods
    public CmbColumn() : base(new CmbCell())
    {
        this.mDataSource = RuntimeHelpers.GetObjectValue(new object());
        this.mValueMember = "";
        this.mDisplayMember = "";
        this.mDataMember = "";
    }    public override object Clone()
    {
        CmbColumn col = (CmbColumn) base.Clone();
        col.DataSource = RuntimeHelpers.GetObjectValue(this.DataSource);
        col.ValueMember = this.ValueMember;
        col.DisplayMember = this.DisplayMember;
        return col;
    }    // Properties
    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            if ((value != null) && !value.GetType().IsAssignableFrom(typeof(CmbCell)))
            {
                throw new InvalidCastException("Must be a CmbCell");
            }
            base.CellTemplate = value;
        }
    }   public object DataSource
    {
        get
        {
            return this.mDataSource;
        }
        set
        {
            if (value != null)
            {
                this.mDataSource = RuntimeHelpers.GetObjectValue(value);
            }
        }
    }   public string DisplayMember
    {
        get
        {
            return this.mDisplayMember;
        }
        set
        {
            this.mDisplayMember = value;
        }
    }   public string ValueMember
    {
        get
        {
            return this.mValueMember;
        }
        set
        {
            this.mValueMember = value;
        }
    }

public class CmbCell : DataGridViewComboBoxCell
{
    // Methods
    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, RuntimeHelpers.GetObjectValue(initialFormattedValue), dataGridViewCellStyle);
        CmbEditingControl ctl = (CmbEditingControl) this.DataGridView.EditingControl;
        CmbColumn col = (CmbColumn) this.OwningColumn;
        if (this.Value != null)
        {
            ctl.Text = this.Value.ToString();
        }
        if (ctl != null)
        {
            ctl.DataSource = RuntimeHelpers.GetObjectValue(col.DataSource);
            ctl.ValueMember = col.ValueMember;
            ctl.DisplayMember = col.DisplayMember;
        }
    }    // Properties
    public override Type EditType
    {
        get
        {
            return typeof(CmbEditingControl);
        }
    }
}public class CmbEditingControl : Cmb, IDataGridViewEditingControl
{
    // Fields
    private DataGridView dataGridViewControl;
    private int rowIndexNum;
    private bool valueIsChanged;    // Methods
    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
    {
        this.Font = dataGridViewCellStyle.Font;
        this.ForeColor = dataGridViewCellStyle.ForeColor;
        this.BackColor = dataGridViewCellStyle.BackColor;
    }    public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
    {
        switch ((keyData & Keys.KeyCode))
        {
            case Keys.Prior:
            case Keys.Next:
            case Keys.End:
            case Keys.Home:
            case Keys.Left:
            case Keys.Up:
            case Keys.Right:
            case Keys.Down:
                return true;
        }
        return false;
    }    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
        return this.SelectedValue;
    }    protected override void OnSelectedValueChanged(EventArgs e)
    {
        this.valueIsChanged = true;
        this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
        base.OnSelectedValueChanged(e);
    }    public void PrepareEditingControlForEdit(bool selectAll)
    {
    }    // Properties
    public DataGridView EditingControlDataGridView
    {
        get
        {
            return this.dataGridViewControl;
        }
        set
        {
            this.dataGridViewControl = value;
        }
    }    public object EditingControlFormattedValue
    {
        get
        {
            return this.SelectedValue;
        }
        set
        {
            this.SelectedValue = RuntimeHelpers.GetObjectValue(value);
        }
    }    public int EditingControlRowIndex
    {
        get
        {
            return this.rowIndexNum;
        }
        set
        {
            this.rowIndexNum = value;
        }
    }    public bool EditingControlValueChanged
    {
        get
        {
            return this.valueIsChanged;
        }
        set
        {
            this.valueIsChanged = value;
        }
    }    public Cursor EditingPanelCursor
    {
        get
        {
            return base.Cursor;
        }
    }    public bool RepositionEditingControlOnValueChange
    {
        get
        {
            return false;
        }
    }    public DataGridView System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
    {
        get
        {
            return this.dataGridViewControl;
        }
        set
        {
            this.dataGridViewControl = value;
        }
    }    public object System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
    {
        get
        {
            return this.SelectedValue;
        }
        set
        {
            this.SelectedValue = RuntimeHelpers.GetObjectValue(value);
        }
    }    public int System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
    {
        get
        {
            return this.rowIndexNum;
        }
        set
        {
            this.rowIndexNum = value;
        }
    }    public bool System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
    {
        get
        {
            return this.valueIsChanged;
        }
        set
        {
            this.valueIsChanged = value;
        }
    }    public Cursor System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
    {
        get
        {
            return base.Cursor;
        }
    }    public bool System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
    {
        get
        {
            return false;
        }
    }
}

解决方案 »

  1.   

    看看这个
    http://www.cnblogs.com/luqingfei/archive/2007/06/22/691372.html
      

  2.   

    datagridview添加
    private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
     { }
    ValueMember的值类型与表格的值DataPropertyName是否导致
      

  3.   


    測試用例中我把這列用datagridviewComboBoxColumn替換, DataSource,valuemember等屬性設置完全相同.不會出問題, 所以不是上述原因.問題應該還是出在派生類的代碼上. 
      

  4.   

    加上dataerror處理, 運行時,這一列的值都沒有顯示出來,下拉框可以下拉,點擊可改變值.但是, 移到別的單元格,這一列又變成空白了. 
      

  5.   

    除了IDataGridViewEditingControl底下的属性设定外,其他没发现其他错误。
      

  6.   


    能不能具体讲讲, IDataGridViewEditingControl底下的属性设定 有什么问题? 谢谢.
      

  7.   

    C#的代码怎么放到VB里来了……