DataGridView锁定在继承的UserControl上

时间:2008-10-16 05:11:22

标签: c# .net winforms inheritance

我有一个带有一些预定义控件的UserControl(groupbox,button,datagridview),这些控件被标记为protected,而components变量也被标记为protected。

然后我想从这个基本UserControl继承到另一个UserControl,但是DataGridView总是被锁定在设计器中。

我怀疑它可能与实现ISupportInitilize的DataGridView有关。

public class BaseGridDetail : UserControl

已定义DataGridView控件(等)。


public class InheritedDetail : BaseGridDetail

DataGridView控件已锁定

有没有人有任何想法如何在继承之后在设计师中使用此控件?

5 个答案:

答案 0 :(得分:11)

从外观上看,DataListView(以及其他一些控件)不支持可视继承。有一个连接问题logged here看起来并不乐观。

使用其他表单控件记录了类似的问题,例如flowlayoutpanel

我无法找到强制视觉继承的方法。

以下是connect的正式答案: “对于这个特定版本,DataGridView并非设计用于视觉传播。我们将在计划未来版本时牢记您的建议” 那是2006年5月26日。

更新:找到this blog post which may have the answer

编辑:我无法验证博文的声明。 看起来像might be the latest on this issue

看起来您仍然可以在运行时操作DataListView,因此您可以设置可视属性(和其他设置)。这不是一个很好的妥协。

答案 1 :(得分:7)

[1]创建自定义用户控件

[2]使您的自定义userControl使用下面的Inherited DataGridView:

[Designer(typeof System.Windows.Forms.Design.ControlDesigner))]
public class InheritedDataGridView : DataGridView { }

[3]继承自己的自定义用户控件,以及中提琴!

[4]哦,别忘了添加“System.Design”dll

享受。

答案 2 :(得分:3)

将数据网格添加到面板控件,并将面板和数据网格的修改器设置为受保护。这将使您所有继承的表单设计时间访问网格的属性。

答案 3 :(得分:1)

我留下了答案,但重新阅读了你的问题并决定将其删除。

您尝试在继承的控件中修改的DataGridView是什么?这是专栏?我已经能够通过在我的基本UserControl中设置一个受保护的方法并将网格的列集合传递给它来实现这一点,如下所示:

// in base UserControl
public BaseGridDetail()
{
    InitializeComponent();

    InitGridColumns(dataGridView1.Columns);
}

protected virtual void InitGridColumns(DataGridViewColumnCollection columns)
{
    columns.Clear();
}

现在您的派生控件可以简单地覆盖该方法,如下所示:

// in InheritedDetail
protected override void InitGridColumns(DataGridViewColumnCollection columns)
{
    base.InitGridColumns(columns);
    // add my own custom columns
}

答案 4 :(得分:0)

将属性更改为xx.designer.cs中定义的[private]到[protected] 这是最初的机器生成代码。

例如

    private System.Windows.Forms.Button btnSave;

    protected System.Windows.Forms.Button btnSave;

并重建它。

然后你可以改变继承控制的属性。