Designer-编辑UserControl中DataGridView的DataSource属性

时间:2010-09-15 13:32:21

标签: c# user-controls datagridview datasource uitypeeditor

我有一个包含多个子控件的自定义UserControl,其中包含一个DataGridView。我不想为任何子控件启用EnableDesignMode,而是根据需要公开和序列化它们的属性。我坚持使用DataGridView的DataSource属性。

我是否需要创建自定义UITypeEditor并使用反射来查找父窗体上的所有BindingSource对象以供选择,还是可以以某种方式调用此类型的内置编辑器?更改DataGridView的DataSource时,编辑器调用了什么类型?

编辑:实际上,奥利弗的建议并没有完全奏效。当我选择我的UserControl时,我确实在属性网格中获得了可绑定对象的列表,在我选择了绑定源之后,绑定数据集的列出现在网格上,但是在编辑Columns集合之后,datagridview的列没有被序列化到designer.cs 。但是,如果我为此datagridview构建自定义ParentControlDesigner和EnableDesignMode,我可以通过它的DesignerVerb设置绑定,然后在编辑后序列化Columns集合。

我以这种方式公开了datagridview的Columns和DataSource属性

[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
[Category("Grid")]
//[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public DataGridViewColumnCollection Columns
{
    get { return dgvListaBaza.Columns; }
}

[AttributeProvider(typeof(IListSource))]
[Browsable(true)]
[Category("Grid")]
public object DataSource
{
    get { return dgvList.DataSource; }
    set { dgvList.DataSource = value; }
}

单击控件的本机designerverb时设置DataSource的方式和通过公开属性的方式之间有什么区别?在选择绑定后,两者都显示了网格中的bindingSource的列,但在后一种情况下,列不会被序列化,就好像在设置DataSource时我需要设置其他内容。

此外,暴露的Columns上的DesignerSerializationVisibility属性没有区别,CollectionEditor中的Names值因我设置DataSource的方式不同(如果它是通过native designerverb设置的,那么它们被命名为SomeColumnDataGridViewTextBoxColumn,如果它已设置通过该属性,每列的Name属性为空。)

1 个答案:

答案 0 :(得分:1)