Вам следует прочитать о дизайнерских технологиях , доступных в .NET, потому что это не то, что я бы назвал готовыми к использованию примерами. Однако это дает вам хорошее начало, и оба фрагмента кода выполняют то, что вы просите.
Во время разработки вы можете переопределить сайт дизайнера в вашем элементе управления и сделать следующее:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Design;
using System.Diagnostics;
namespace WindowsFormsControlLibrary1 {
public partial class DebugControl : UserControl {
public DebugControl() {
InitializeComponent();
}
public override ISite Site
{
get
{
return base.Site;
}
set
{
base.Site = value;
IComponentChangeService service = (IComponentChangeService)GetService(typeof(IComponentChangeService));
service.ComponentAdding += (sender, e) => {
IDesignerHost host = (IDesignerHost)value.Container;
Component component = (Component)host.RootComponent;
if (component as Form != null)
{
Form form = (Form)component;
foreach (Control c in form.Controls)
{
if (c.GetType() == this.GetType())
{
throw new System.ArgumentException("You cannot add two of these controls to a form!");
}
}
}
};
}
}
}
}
Для времени выполнения в вашей форме вы можете переопределить OnControlAdded и сделать следующее:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using WindowsFormsControlLibrary1;
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnShown(EventArgs e)
{
Controls.Add(new DebugControl());
}
protected override void OnControlAdded(ControlEventArgs e)
{
base.OnControlAdded(e);
if (e.Control.GetType() == typeof(DebugControl))
{
int count = 0;
foreach (Control c in Controls)
{
if (c is DebugControl)
{
count++;
}
}
if (count > 1)
{
Controls.Remove(e.Control);
Debug.Assert(false, "Cannot add two of these controls!");
}
}
}
}
}
Есть несколько способов сделать это, но это грубые примеры, учтите. Узнайте о поддержке во время разработки, что платформа .NET очень богата, и есть обширная документация по ней. Другой метод заключается в реализации пользовательских конструкторов и реализации CanBeParentedTo и CanParent, но учтите, что CanBeParentedTo не вызывается, когда ваш элемент управления передается из ToolBox в вашу форму.