我有一个带有一些预定义控件的UserControl(groupbox,button,datagridview),这些控件被标记为protected,而components变量也被标记为protected。
然后我想从这个基本UserControl继承到另一个UserControl,但是DataGridView总是被锁定在设计器中。
我怀疑它可能与实现ISupportInitilize的DataGridView有关。
public class BaseGridDetail : UserControl
已定义DataGridView控件(等)。
public class InheritedDetail : BaseGridDetail
DataGridView控件已锁定
有没有人有任何想法如何在继承之后在设计师中使用此控件?
答案 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;
并重建它。
然后你可以改变继承控制的属性。