Главная » C#, Компоненты » Встроенные компоненты в CSharp примеры использования

0

В разд. 6.13 я уже рассказывал о компонентах, содержащих другие компоненты. Тогда для передачи Windows-сообщений мы использовали специальный обработчик wndproc. Это позволяло "выключать" режим дизайнера для внутренних компонентов, т. е. компоненты начинали работать так, как будто они работают в режиме выполнения. В этом разделе я хочу рассказать об интерфейсе TNestedContainer, позволяющем делать внутренние компоненты фактически реальными компонентами формы.

Добавим в компонент, содержащий внутри себя ListBox, вызов метода Add класса iNestedContainer, регистрируя, таким образом, внутренний компонент (листинг 7.14).

Полученный компонент содержит внутри себя компонент ListBox, который полностью поддерживается дизайнером, т. е. позволяет менять размеры, положение, запускать смарт-теги и т. п. Более того, он виден в инспекторе объектов с именем nestedContainerControll.logListBox, которое составляется ИЗ имени контейнера и имени компонента (рис. 7.7).

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

Листинг 7 14 Регистрация внутреннего компонеша с помощью инюрфсисл INestedCon tamer

using System;

using System.Data;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Windows.Forms;

using System.Windows.Forms.Design;

namespace NestedContainerExample {

public class NestedContainerControl : UserControl

{

// Буфер для отображения сообщений private ListBox logListBox;

// Конструктор

public NestedContainerControl()

}

InitializeComponent();

}

private void InitializeComponent()

{

this.logListBox = new ListBox(); this.SuspendLayout();

this.logListBox.Location = new System.Drawing.Point(5, 5); this.logListBox.Name = "logListBox";

this.logListBox.Size = new System.Drawing.Size(345, 268); this.logListBox.Tablndex – 0; this.BackColor = System.Drawing.Color.Beige; this.Controls.Add(this.logListBox);

this.Location – new System.Drawing.Point(500, 400); this.Name = "ComponentClassl";

this.Size = new System.Drawing.Size(442, 422); this.ResumeLayout(false};

}

// Свойство Site устанавтсивается дизайнером только //в режиме разработки в момент установки связи между // дизайнером и компонентом. Именно в этот момент мы // будем регистрировать обработчики событий сервиса public override ISite Site !

get {

return base.Site;

}

set

{

// Сохраняем значение Site base.Site – value;

// регистрация внутреннего компонента if (value != null)

{

INestedContainer nc =

(INestedContainer)this.Site.GetService(

typeof(INestedContainer));

if (nc != null) {

nc.Add(this.logListBox, "logListBox");

}

}

// Заполняем ListBox

for (int i – 0; i < 100; i++)

logListBox.Items.Add(i.ToString ());

}

)

}

}

Рис. 7.7. Внутренний компонент I istB^x имеет имя

nestedContainerControll.logListBox

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии