Очистить элементы InnerList свойства настраиваемого элемента управления после удаления настраиваемого элемента управления из формы в режиме конструктора

Я добавляю созданный мной настраиваемый элемент управления в новую форму Windows и добавляю к ней вкладку с помощью свойства «Вкладки». Однако, когда я удаляю свой настраиваемый элемент управления из Windows Form, элементы свойства «Tabs» не удаляются. Пожалуйста, смотрите рисунки ниже для получения дополнительной информации:

Свойство вкладок моего настраиваемого элемента управления с его редактором коллекции

Рисунок 1. Свойство настраиваемого элемента управления Tabs с его редактором коллекции

  1. Синий ящик: свойство "Вкладки" моего настраиваемого элемента управления
  2. Красный ящик: добавлены элементы в свойство «Вкладки».

На экране 1 отображается, когда я добавляю какой-либо элемент в свойство Tabs.

Элементы управления проектом Windows Form после добавления элемента в свойство Tabs

Рисунок 2. Элементы управления проектом Windows Form после добавления элемента в свойство Tabs

  1. Красный ящик: мой пользовательский элемент управления
  2. Синий ящик: добавлены элементы в свойство вкладок.

Элементы управления проектом Windows Form после удаления моего настраиваемого элемента управления из Windows Form

Рисунок 3. Элементы управления проектом Windows Form после удаления моего настраиваемого элемента управления из Windows Form

  • Красный ящик: добавлены элементы в свойство вкладок.

Как вы можете видеть на рисунках 2 и 3, я добавляю некоторый элемент в свойство Tabs, и после удаления моего настраиваемого элемента управления из его родительского элемента управления (Windows Form) элементы свойств Tabs не были удалены.

Свойство My Tabs связано с классом Tabs, который является производным от класса CollectionBase и реализует для него некоторые методы, такие как Add, Remove, Clear и т. Д. И я вызываю методы Clear и RemoveRange в методе Dispose, но это не работает.

Мои коды следующие:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
[ToolboxItem(true), ToolboxBitmap(typeof(ToolboxIconResourceFinder), "FloorsGrouping.bmp")]
[DisplayName("Floors Group")]
[Editor("WindowsFormsControlLibrary2.FloorsGrouping, WindowsFormsControlLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=197889249da45bfc", typeof(UITypeEditor))]
[Description("Floorssssssss")]
[Category("Saino")]
//[DefaultEvent("")]
[DefaultProperty("Text")]
[DesignerCategory("Component")] //Form //Designer //Empty String ("")
public partial class FloorsGrouping : Bar
{
    private static Font fntDefaultFont = SystemFonts.DefaultFont;
    private static string strDefaultAccessibleDescription = "";
    private static string strDefaultAccessibleName = "";

    private bool canDockBottom = false;
    private bool canDockTop = false;
    private bool fadeEffect = true;
    private int selectedDockTab = 0;
    private eDotNetBarStyle style = eDotNetBarStyle.StyleManagerControlled;
    private string text = "Floors Grouping";
    private FloorsInformation floorsInformation = new FloorsInformation();
    private Tabs tabs = new Tabs();
    private SupportedLanguages language = SupportedLanguages.English;
    private Styles groupingStyles = Styles.Classic;

    public FloorsGrouping()
    {
        InitializeComponent();
        ResetFont();
        ResetAccessibleDescription();
        ResetAccessibleName();
    }

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        Tab.Clear();
        Tab.RemoveRange(0, Tab.Count);
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private new void ResetFont()
    {
        Font = fntDefaultFont;
    }

    private new bool ShouldSerializeFont()
    {
        return !Font.Equals(fntDefaultFont);
    }

    [Category("Data")]
    [DisplayName("Tabs")]
    [Description("Tabsssssssssssss")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Editor(typeof(ItemsCollectionEditor), typeof(UITypeEditor))]
    //[Editor(typeof(ItemsCollectionEditor<SimilarFloorsInformation>), typeof(UITypeEditor))]
    //[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
    public Tabs Tab
    {
        get
        {
            return tabs;
        }
    }

    [Category("Behavior")]
    [DisplayName("ContainerControl")]
    [Description("It indicates container control high lighter is bound to. It should be set to parent form.")]
    //[DefaultValue("")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Browsable(false), ReadOnly(true)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public Control ContainerControl
    {
        get { return hltMain.ContainerControl; }
        private set { hltMain.ContainerControl = this; }
    }

    protected override void OnParentChanged(EventArgs e)
    {
        ContainerControl = this;
    }
    protected override void OnCreateControl()
    {
        base.OnCreateControl();
    }

    protected override void OnControlRemoved(ControlEventArgs e)
    {
        //Tab.RemoveRange(0, tabs.Count);
        //Parent.Refresh();
        base.OnControlRemoved(e);
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }
}

[DisplayName("Floors Information")]
[Description("Floors Informationnnnnnnnnnnnnnnn")]
[DefaultProperty("Text")]
[DesignerCategory("Component")]
[ToolboxItem(false)]
public class FloorsInformation : DockContainerItem
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    private SimilarFloorsInformation similarFloorsInformation = new SimilarFloorsInformation();
    private AllFloorsInformation allFloorsInformation = new AllFloorsInformation();
    private string text = "Floors Information";

    public FloorsInformation()
    {
    }

    [Browsable(false), ReadOnly(true)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public new bool AutoCollapseOnClick
    {
        get { return base.AutoCollapseOnClick; }
    }

    [Browsable(false), ReadOnly(true)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public new Control Control
    {
        get { return base.Control; }
    }

    public new string Text
    {
        get
        {
            return text;
        }
        set
        {
            text = value;
        }
    }

    [Category("Data")]
    [DisplayName("Similar Floors Panel")]
    [Description("Similar Floors Panellllllllllllllllllll")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public SimilarFloorsInformation SimilarFloorsInfo
    {
        get
        {
            return similarFloorsInformation;
        }
        set
        {
            similarFloorsInformation = value;
        }
    }

    [Category("Data")]
    [DisplayName("All Floors Group")]
    [Description("All Floors Groupppppppppppppp")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public AllFloorsInformation AllFloorsInfo
    {
        get
        {
            return allFloorsInformation;
        }
        set
        {
            allFloorsInformation = value;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
}

public class Tabs : CollectionBase
{
    public FloorsInformation this[int intIndex]
    {
        get
        {
            return (FloorsInformation)InnerList[intIndex];
        }
        set
        {
            InnerList[intIndex] = value;
        }
    }

    public int Add(FloorsInformation finfItemType)
    {
        return InnerList.Add(finfItemType);
    }

    public new void Clear()
    {
        InnerList.Clear();
    }

    public bool Contains(FloorsInformation finfItemType)
    {
        return InnerList.Contains(finfItemType);
    }

    public void Remove(FloorsInformation finfItemType)
    {
        InnerList.Remove(finfItemType);
    }

    public new void RemoveAt(int intIndex)
    {
        InnerList.RemoveAt(intIndex);
    }

    public void RemoveRange(int intIndex, int intCount)
    {
        InnerList.RemoveRange(intIndex, intCount);
    }

    public void Insert(int intIndex, FloorsInformation finfItemType)
    {
        InnerList.Insert(intIndex, finfItemType);
    }

    public void Reverse()
    {
        InnerList.Reverse();
    }

    public void Reverse(int intIndex, int intCount)
    {
        InnerList.Reverse(intIndex, intCount);
    }

    public int IndexOf(FloorsInformation finfItemType)
    {
        return InnerList.IndexOf(finfItemType);
    }

    public void AddRange(FloorsInformation[] finfItemType)
    {
        InnerList.AddRange(finfItemType);
    }

    public FloorsInformation[] GetValues()
    {
        FloorsInformation[] finfItemType = new FloorsInformation[InnerList.Count];
        InnerList.CopyTo(0, finfItemType, 0, InnerList.Count);
        return finfItemType;
    }

    protected override void OnInsert(int intIndex, object objValue)
    {
        base.OnInsert(intIndex, objValue);
    }

    protected override void OnClear()
    {
        base.OnClear();
    }
}

public class ItemsCollectionEditor : CollectionEditor
{
    private Type[] typItems;

    public ItemsCollectionEditor(Type typItem)
        : base(typItem)
    {
        typItems = new Type[] { typeof(FloorsInformation) };
    }

    protected override Type[] CreateNewItemTypes()
    {
        return typItems;
    }

    protected override CollectionForm CreateCollectionForm()
    {
        CollectionForm collectionForm = base.CreateCollectionForm();
        collectionForm.Text = "Tabs Collection Editor";
        return collectionForm;
        //return base.CreateCollectionForm();
    }
}

Я хочу сделать что-то вроде управления панелью DevComponents.DotNetBar. Для получения дополнительной информации см. Следующее:

Добавить элемент управления Bar в форму Windows

Рисунок 4. Добавление элемента управления Bar в форму Windows

  1. Левое красное поле: добавлен элемент управления Bar в форму Windows.
  2. Правое красное поле: добавлен элемент управления Bar в сетке свойств Visual Studio

Когда элемент управления Bar добавляется в форму Windows Forms, Property Grid изменяется, как вы можете видеть на рисунке 4.

Создать вкладку док-станции с помощью параметра задач панели

Рисунок 5. Создание вкладки Dock с помощью параметра «Панель задач»

  • Красный прямоугольник: параметр «Создать вкладку док-станции» в разделе «Задачи панели».

С помощью опции «Create Dock Tab» в разделе «Bar Tasks» мы можем создать новую Dock Tab для добавления новых элементов управления на определенную вкладку Bar control, как вы можете видеть на рисунке 5.

Добавлен элемент контейнера док-станции и связанный с ним контейнер док-станции панели

Рисунок 6. Добавлен элемент контейнера док-станции и связанный с ним контейнер док-станции панели

  1. Red Box: добавлен элемент управления Bar в сетку свойств Visual Studio.
  2. Левое синее поле: добавлен элемент управления Dock Container Item в элемент управления Bar.
  3. Правое синее поле: добавлен элемент управления элементом контейнера док-станции в сетку свойств Visual Studio.
  4. Левая зеленая рамка: добавлен элемент управления контейнером панели док-станции в элемент управления контейнером док-станции.
  5. Правый зеленый прямоугольник: добавлен элемент управления контейнером панели Dock в сетку свойств Visual Studio

Добавлены элементы контейнера док-станции и связанные с ним контейнеры док-станции панели

Рисунок 7. Добавленные элементы док-контейнера и связанные с ним док-контейнеры панели

  1. Красная рамка: см. Красную рамку на Рисунке 6.
  2. Левое синее поле: добавлены элементы управления элементами контейнера док-станции в элемент управления Bar.
  3. Правое синее поле: добавлены элементы управления элементом контейнера док-станции в сетку свойств Visual Studio.
  4. Правый зеленый прямоугольник: добавлены элементы управления контейнером панели Dock в сетку свойств Visual Studio

Каждый раз, когда выбирается параметр «Создать вкладку док-станции» в разделе «Задачи панели», в элементе управления «Панель» DevComponents.DotNetBar создается новый элемент управления элементом контейнера док-станции со связанным с ним элементом управления «Контейнер док-станции» (см. Рис. 6 и 7).

Сетка свойств Visual Studio после удаления элемента управления

Рисунок 8. Сетка свойств Visual Studio после элемента управления «Удалить»

  • Красный прямоугольник: элемент управления Windows Form в таблице свойств Visual Studio

Когда элемент управления Bar удаляется из Windows Form, все связанные с ним элементы управления удаляются вместе с ним, и остается только Windows Form.

Я хочу автоматически удалять элементы свойства «Вкладки» после того, как мой настраиваемый элемент управления удаляется из его родительского элемента управления (Windows Form).


person MRS1367    schedule 24.10.2012    source источник


Ответы (3)


Я нашел решение. Для автоматического удаления элементов свойства «Вкладки» после удаления настраиваемого элемента управления из его родительского элемента управления (Windows Form) необходимо применить некоторые изменения к методу «Dispose» класса «FloorsGrouping», унаследованному от класса «Bar». См. Следующую строку кодов, которые необходимо изменить:

protected override void Dispose(bool disposing)
{
    Tab.Clear();
    Tab.RemoveRange(0, Tab.Count);
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

См. Следующую строку кодов, которые были изменены для достижения цели:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }

    if (Tab.Count > 0)
    {
        foreach (FloorsInformation floorsInformation in Tab)
        {
            floorsInformation.Dispose();
        }
    }
    base.Dispose(disposing);
}
person MRS1367    schedule 04.11.2012

Вы можете просто удалить их из сгенерированного кода, который представляет собой файл Form1.generated.cs, в котором определена InitializeComponent ().

В основном вкладки можно использовать повторно, поэтому это может быть причиной того, что VS не удаляет их автоматически, но это не более чем предположение.

person TGlatzer    schedule 24.10.2012
comment
Tnx для Ура Ответ Grumbler85. - person MRS1367; 25.10.2012

Хорошо, я рискну предположить, но я никогда не работал с DotNetBar, поэтому я мог бы уйти. Мне кажется, что все элементы управления должны быть добавлены к объекту-контейнеру, чтобы он отображался визуально (например, форма, панель и т. Д.). Если вы добавляете эти вкладки в этот элемент управления, производный от Bar, и если Bar не является контейнером, то я должен предположить, что на каком-то уровне ваши вкладки добавляются в массив Controls формы.

Следовательно, когда вы удаляете элемент управления Bar, вкладки не удаляются, потому что они все еще находятся в области действия (поскольку форма все еще жива).

Изменить 1 после уточнения

Это кажется интересным:

[Category("Behavior")]
[DisplayName("ContainerControl")]
[Description("It indicates container control high lighter is bound to. It should be set to parent form.")]
//[DefaultValue("")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Browsable(false), ReadOnly(true)]
[EditorBrowsable(EditorBrowsableState.Never)]
public Control ContainerControl
{
    get { return hltMain.ContainerControl; }
    private set { hltMain.ContainerControl = this; }
}

Похоже, что это неправильно, если вы устанавливаете ContainerControl на себя (он говорит, что он должен быть установлен в форме). Но опять же, я не уверен, что это вообще актуально.

person Chris Barlow    schedule 24.10.2012