在 DataGridView 中使用自定义控件

Use a custom control in DataGridView

我有一个通用的自定义控件,其中包含一个文本框和一个按钮。其他自定义控件继承自这个通用控件并指定具体类型,例如:

public class CustomerType
{
    public int Id {get; set;}
    public int Number {get; set;}
    public string Description {get; set;}
}

通用控件有一个 Value 属性,它取决于 Type 参数和一个 Text 属性,这取决于类型,可能会显示 CustomerType.DescriptionProductType.Name.

这些控件用于搜索(例如客户类型、产品类型等)。

这些控件放在普通窗体上时工作正常。现在我需要将此类控件放置在 DataGridView 列中,因此我尝试遵循此 MSDN article.

目前,派生的 2 个 类 看起来像这样:

public class CustomerTypeColumn : DataGridViewColumn
{
    public CustomerTypeColumn()
        : base(new CustomerTypeCell()) 
    { }

    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            if (value != null && !value.GetType().IsAssignableFrom(typeof(CustomerTypeCell)))
            {
                throw new InvalidCastException("Should be CustomerTypeCell.");
            }

            base.CellTemplate = value;
        }
    }
}

public class CustomerTypeCell : DataGridViewTextBoxCell
{
    public CustomerTypeCell() 
        : base() 
    { }

    public override Type ValueType
    {
        get
        {
            return typeof(CustomerType);
        }
    }
}

但是该列仍然显示文本框而不是我的自定义控件。我在这里错过了什么?此外,我将如何以及在哪里为网格中的单元格保存 Value 属性?

您尚未覆盖 CustomerTypeCellEditType。这就是为什么它仍然显示 DataGridViewTextBoxCell 的默认编辑控件,它是 TextBox.

您必须像在您引用的 MSDN link 中那样创建自定义编辑控件,或者在您的自定义控件中实现 IDataGridViewEditingControl 控件。 ReturnEditType中自定义编辑控件的类型。

public class CustomerTypeCell : DataGridViewTextBoxCell
{
    public CustomerTypeCell() 
        : base() 
    { }

    public override Type ValueType
    {
        get
        {
            return typeof(CustomerType);
        }
    }

    public override Type EditType
    {
        get
        {                 
            return typeof(CustomEditingControl);
        }
    }       
}

该单元格已有一个值 属性。将控件的值 属性 存储在其中。