在 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.Description
或 ProductType.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
属性?
您尚未覆盖 CustomerTypeCell
的 EditType
。这就是为什么它仍然显示 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);
}
}
}
该单元格已有一个值 属性。将控件的值 属性 存储在其中。
我有一个通用的自定义控件,其中包含一个文本框和一个按钮。其他自定义控件继承自这个通用控件并指定具体类型,例如:
public class CustomerType
{
public int Id {get; set;}
public int Number {get; set;}
public string Description {get; set;}
}
通用控件有一个 Value
属性,它取决于 Type 参数和一个 Text
属性,这取决于类型,可能会显示 CustomerType.Description
或 ProductType.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
属性?
您尚未覆盖 CustomerTypeCell
的 EditType
。这就是为什么它仍然显示 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);
}
}
}
该单元格已有一个值 属性。将控件的值 属性 存储在其中。