在复合UserControl中在Designer上公开DataGridView的Columns属性

时间:2012-12-12 19:39:33

标签: .net winforms datagridview windows-forms-designer

假设我有一个复合UserControl(称为'ListTable'),它由一个标签,两个按钮和一个DataGridView组成。标签是DataGridView的标题,两个按钮是Add Row和Delete Row,具有基本的,明显的功能。

如何在Designer中公开DataGridView的列,以便我可以通过UserControl以与编辑DataGridView本身时完全相同的方式编辑DataGridView的列?

我做了什么:

通过“List”形式的名为“TableColumns”的属性在ListTable中包装DataGridView的Columns属性的各种组合,具有各种属性值,例如:

[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
    [Editor(typeof(TableColumnEditor),
        typeof(System.Drawing.Design.UITypeEditor))]
    public List<DataGridViewColumn> TableColumns
    {
        get
        {
            List<DataGridViewColumn> columns = new List<DataGridViewColumn>();
            foreach (DataGridViewColumn col in table.Columns)
            {
                columns.Add(col);
            }

            return columns;
        }
        set
        {
            this.table.Columns.Clear();

            foreach (DataGridViewColumn col in value)
            {
                this.table.Columns.Add(col);
            }
        }
    }

TableColumnEditor的位置是:

class TableColumnEditor : CollectionEditor
{
    public TableColumnEditor(Type type) : base(type) { }

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        object result = base.EditValue(context, provider, value);
        ((ListTable)context.Instance).TableColumns = (List<DataGridViewColumn>)result;

        return result;
    }
}

这些似乎都不起作用。其中大部分只是我不完全理解的祈祷拼凑。

所以,经典的两难困境:我确实需要坐下来了解这些内脏,但我没有(工作)时间通过MSDN更深奥的WinForms文章做一个不专心,悠闲的流浪汉。以上代码是否可以挽救?这是正确的方向吗?

1 个答案:

答案 0 :(得分:0)

这有用吗:

在表单(BindingSource1)上放置一个BindingSource。

将DataGridView的数据源设置为Binding1。

打开相关表单的设计器,假设您要显示MyObject类的列,请输入以下内容:

this.BindingSource1.Datasource = typeof(YourNamespace.MyObject);