Проверка, добавлен ли пользовательский элемент управления в форму - PullRequest
0 голосов
/ 23 сентября 2011

Я создаю собственный элемент управления C # (строка заголовка формы). Одна форма может иметь только одну строку заголовка, и поэтому мне интересно кое-что: когда пользователь (программист) добавляет мою строку заголовка к своей форме, есть ЛЮБОЙ способ проверить, содержит ли ParentForm строку заголовка, и если да, то может я отменяю добавление еще одного экземпляра моего контроля?

Я знаю, как выполнить проверку, чтобы увидеть типы элементов управления, которые содержит ParentForm, но какое событие возникает, когда мой элемент управления сбрасывается с панели инструментов в форму, и как «отменить» макет элемента управления при необходимости?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

Вам следует прочитать о дизайнерских технологиях , доступных в .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 в вашу форму.

0 голосов
/ 23 сентября 2011

Обработайте событие ParentChanged, проверьте родительский элемент Controls и, если необходимо, сгенерируйте исключение.

0 голосов
/ 23 сентября 2011

Вы можете использовать Controls коллекцию активных form.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...