我用controlcollection创建了一个控件。当我在设计时从属性窗口添加项目时。它完美地添加了。当我打开它时。添加的项目告诉我。但是,当我关闭表单然后再次打开它时,项目被删除了。
现在我在集合中添加了两个项目。 这些物品看起来很完美。
但是,当我打开Form.Desigern.cs
文件时,缺少以下行。
this.xWizardControl.Window.Controls.Add(this.xWizardPage1);
this.xWizardControl.Window.Controls.Add(this.xWizardPage2);
代码看起来像这样。
public class XWizardPageWindow : DevExpress.XtraEditors.XtraUserControl, ISupportInitialize
{
private XWizardPageCollection _pages;
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public XWizardPageCollection Pages
{
get { return _pages; }
set { _pages = value; }
}
public XWizardPageWindow()
{
}
#region Override Methods
protected override ControlCollection CreateControlsInstance()
{
if (_pages == null)
_pages = new XWizardPageCollection(this);
return _pages;
}
#endregion
#region ISupportInitialize Members
public void BeginInit()
{
//DO NOTHING
}
public void EndInit()
{
//DO NOTHING
}
#endregion
}
ControlCollection类
public class XWizardPageCollection : System.Windows.Forms.Control.ControlCollection
{
public delegate void XWizardPageEventHandler(object sender, XWizardPageEventArgs e);
List<XWizardPage> _pages = new List<XWizardPage>();
#region Constructor
public XWizardPageCollection(System.Windows.Forms.Control owner): base(owner)
{}
#endregion
#region Override Methods
public override void Add(System.Windows.Forms.Control value)
{
base.Add(value);
value.Dock = System.Windows.Forms.DockStyle.Fill;
((XWizardPage)value).BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
}
#endregion
#region Destructor
~XWizardPageCollection()
{
GC.SuppressFinalize(this);
}
#endregion
}
答案 0 :(得分:1)
首先,ControlCollection创建并返回后,永远不应更改CreateControlsInstance。因此,Pages
属性应定义为ReadOnly
。
其次,当使用Visible时,您告诉代码生成器创建Pages
的新实例,这是我们不想要的。因此,将DesignerSerializationVisibilityAttribute从Visible
更改为Content
,代码生成器将为对象(Pages)的内容生成代码,而不是为对象本身生成代码。