假设我有一个复合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文章做一个不专心,悠闲的流浪汉。以上代码是否可以挽救?这是正确的方向吗?
答案 0 :(得分:0)
这有用吗:
在表单(BindingSource1
)上放置一个BindingSource。
将DataGridView的数据源设置为Binding1。
打开相关表单的设计器,假设您要显示MyObject
类的列,请输入以下内容:
this.BindingSource1.Datasource = typeof(YourNamespace.MyObject);