Je crée mon propre TabControl avec des pages personnalisées. Ça avance bien sauf pour la partie suppression. Lorsque j'ajoute TabControl à un formulaire dans le concepteur tout fonctionne bien, 2 TabPages par défaut sont ajoutés et le contrôle est dessiné. Mais lorsque je supprime TabControl du formulaire dans le concepteur, les TabPages qui font partie de la collection TabControl.Controls ne sont pas supprimés du code du concepteur. Ils perdent juste leur parent.Supprimer les contrôles enfants à partir du code de concepteur
Des pensées?
Pour la création, j'utilise le code suivant.
public class CustomTabControlDesigner : ParentControlDesigner
{
DesignerVerbCollection _fVerbs;
public override DesignerVerbCollection Verbs
{
get
{
if (_fVerbs == null)
{
_fVerbs = new DesignerVerbCollection(new[] { new DesignerVerb("Add Tab", OnAdd), new DesignerVerb("Del Tab", OnDel) });
}
return _fVerbs;
}
}
void OnAdd(object sender, EventArgs e)
{
IDesignerHost designerHost = (IDesignerHost)GetService(typeof(IDesignerHost));
if (designerHost != null)
{
WTabPage newPage = (WTabPage)designerHost.CreateComponent(typeof(WTabPage));
//newPage.Text = newPage.Name;
((WTab)Component).Controls.Add(newPage);
}
}
void OnDel(object sender, EventArgs e)
{
IDesignerHost designerHost = (IDesignerHost)GetService(typeof(IDesignerHost));
if (designerHost != null)
{
((WTab)Component).Controls.Remove(((WTab)Component).SelectedTab);
}
}
public override void InitializeNewComponent(IDictionary defaultValues)
{
base.InitializeNewComponent(defaultValues);
for (int i = 0; i < 2; i++)
{
OnAdd(this, EventArgs.Empty);
}
}
//protected override void Dispose(bool disposing)
//{
// for (int i = ((WTab)Component).Controls.Count - 1; i >= 0; i--)
// {
// ((WTab)Component).Controls.Remove(((WTab)Component).Controls[i]);
// }
// base.Dispose(disposing);
//}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
// Selection of tabs via mouse
if (m.Msg == 0x201/*WM_LBUTTONDOWN*/)
{
WTab control = (WTab)Component;
int lParam = m.LParam.ToInt32();
Point hitPoint = new Point(lParam & 0xffff, lParam >> 0x10);
if (Control.FromHandle(m.HWnd) == null) // Navigation
{
if (hitPoint.X < 18 && control.SelectedIndex > 0) // Left
{
control.SelectedIndex--;
}
else
{
control.SelectedIndex++; // Right}
}
}
else
{
// Header click
for (int i = 0; i < control.TabCount; i++)
{
if (control.GetTabRect(i).Contains(hitPoint))
{
control.SelectedIndex = i;
return;
}
}
}
}
}
protected override void OnDragDrop(DragEventArgs de)
{
((IDropTarget)((WTab)Component).SelectedTab).OnDragDrop(de);
}
protected override void OnDragEnter(DragEventArgs de)
{
((IDropTarget)((WTab)Component).SelectedTab).OnDragEnter(de);
}
protected override void OnDragLeave(EventArgs e)
{
((IDropTarget)((WTab)Component).SelectedTab).OnDragLeave(e);
}
protected override void OnDragOver(DragEventArgs de)
{
((IDropTarget)((WTab)Component).SelectedTab).OnDragOver(de);
}
}
Le onAdd et Ondel sont triggerd par les tâches non lorsque la commande est ajoutée ou supprimée: Task Img
pourrait-il, que vous devez remplacer '((WTab) Component) .Controls.Remove (((WTab) Component) .SelectedTab)' dans '' OnDel' avec ((WTab) Component). Controls.Clear(); '? –
La méthode OnDel n'est pas déclenchée lorsque le contrôle est effacé à ma connaissance, il est utilisé dans les Tâches TabControl lorsque vous appuyez sur le triangle en haut à droite. –
Remplacez-vous la méthode Dispose de 'WTab'? Pouvez-vous poster le code de vos contrôles 'WTab' et' WTabPage'? En particulier le code où les pages sont ajoutées/supprimées et toutes les méthodes de disposition. –