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

0

Очень часто возникает задача сохранить некоторые данные, нужные только для режима разработки. Если бы такие данные являлись свойствами компонента, можно было бы использовать способ, описанный в разд. б. 7. Но добавление свойств времени разработки— не всегда подходящий способ. В некоторых случаях подойдет использование сервиса IDictionaryServiceDesigner, который предоставляет доступ к хэш-таблице данных компонента, доступных только в режиме разработки. Эта таблица хранит соответствие ключа (key) и значения (value).

Сервис имеет два основных метода:

D метод object Getvaiue (object key) возвращает значение ключа; D метод void setvaiue (object key, object vaiue) устанавливает значение

ключа. Если такого ключа еще нет, то он добавляется. В листинге 7.11 показан пример компонента, который при инициализации дизайнера сохраняет некоторый набор данных в таблице данных, а при отображении считывает их. В качестве данных я добавляю типизированный массив List<string>, в который записано несколько строк информации.

Листинг 7.11 XpjHCHMo пользовательских данных измени рн грабогьи

using System;

using System.Collections;

using System.ComponentModel;

using System.ComponentModel.Design;

using System. Drawing;

using System.Data;

using System.Windows.Forms;

using System.Collections.Generic;

using System.Windows.Forms.Design;

namespace DietionaryServiceControlExample i

[DesignerAttribute(typeof(IDictionaryServiceDesigner), typeof(IDesigner))]

public class DictionaryServiceControl : UserControl

{

// Хранит отображаемые строки private List<string> drawLines;

public DictionaryServiceControl() (

// Инициализация компонента drawLines = new List<string>(); this.Size = new Size(344, 88); this.BackColor = Color.White;

}

// Рисуем данные, полученные с помощью // сервиса IDictionaryService

protected override void OnPaint(PaintEventArgs e)

{

// Получаем интерфейс сервиса IDictionaryService IDictionaryService ds =

(IDictionaryService)GetService(

typeof(IDictionaryService));

if (ds != null) (

// Получаем значение ключа "DesignerData" List<string> designerData =

(List<string>)ds.GetValue("DesignerData"); if (designerData != null) (

// Просто рисуем созданные строки int line = 5;

foreach (string s in designerData) (

e.Graphics.Drawstring(s,

new Font(FontFamily.GenericMonospace, 9), new SolidBrush(Color.Blue), 5, line);

line += 10;

}

}

else (

base.OnPaint (e};

}

// Дизайнер компонента

public class IDictionaryServiceDesigner : ControlDesigner (

public IDictionaryServiceDesigner()

( >

public override void Initialize(iComponent component) (

base.Initialize(component); IDictionaryService ds =

(IDictionaryService)component.Site.GetService( typeof(IDictionaryService));

if <ds != null) {

11 Создаем ключ DesignerData и привязываем 11 к нему List<string>

if (ds.GetValue("DesignerData") — null) {

ds. SetValue ("DesignerData", new L.ist<string> () ) ;

}

// Получаем значение DesignerData и заполняем некоторые строки List<string> list = (List<string>)ds.GetValue("DesignerData"); if (list !- null}

list.Clear();

list.Add("Тип дизайнера : " + this.GetType().Name); list.AddC’Tnn компонента: " + this.Control.GetType {). Name)/ list.Add("HM« компонента: " + this.Control.Name);

}

}

}

}

}

Литература:

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

По теме:

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