Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

РазработкаОфисныхЗаст

.pdf
Скачиваний:
5
Добавлен:
07.02.2016
Размер:
1.18 Mб
Скачать

151

додаванні елементів керування в потоковий макет необхідно враховувати, що елементи керування будуть зміщуватися разом зі вмістом відповідно до його змін. Не можна прикріпити елемент керування до параграфу, перетягуючи його з елемента керування Панель елементів, оскільки елемент керування додається в документ Word за допомогою стилю обтікання "У тексті". Елемент керування можна вставити іншим чином: наприклад, подвійне натискання на елементі додасть його до тексту, відповідно до параметрів Word, встановлених для додавання зображень. Для елементів керування, при додаванні яких використовується стиль обтікання "У тексті", не можна встановити властивості Left або Top. Не можна поміщати елементи керування в верхній і нижній колонтитули, а також у вкладений документ;

− при виборі елемента керування події виникають в наступному порядку: Enter, GotFocus, а при скасуванні вибору елемента

керування: Leave Validating Validated LostFocus;

при виборі значення масштабування, відмінного від 100% елементи керування в документі відключаються, хоча їх видимий масштаб змінюється разом з документом;

незважаючи на те, що в Windows Forms для властивостей елементів керування встановлюється ціле значення, в документі Word для властивостей встановлюється єдине значення. У Excel для властивостей елементів керування встановлюється подвійне значення. Якщо значення таких властивостей елементів керування, як Height і Width, перевищують розмір робочого аркуша або екрана, значення урізаються;

при зміні розмірів елемента керування за допомогою одного з 8 маркерів зміни розміру, вимірювання не будуть відображатися у вікні Властивості, поки елемент керування не буде обраний повторно;

при використанні розділеного вікна аркуша поведінка

елементів

керування

в

аркуші

Excel

може

бути

непередбачуваною. Наприклад, доступ

до TextBox на робочому

аркуші може надаватися тільки в одному з вікон;

 

 

для найменування елементів керування не можна використовувати зарезервовані слова;

не можна використовувати конструктор елемента керування

152

для додавання елемента керування до документа під час виконання. Слід використовувати допоміжні методи, передбачені в середовищі виконання Visual Studio Tools for Office. Наприклад, використовуйте метод AddButton, щоб додати кнопку в робочий аркуш;

− копіювання елемента керування: якщо скопіювати елемент керування Windows Forms і вставити його в документ під час виконання, незаповнений контейнер елемента ActiveX вставляється в документ. При такому додаванні елемент керування Windows Forms не відображається в новому місці, і код, який містить вихідний елемент керування, не копіюється в контейнер елемента ActiveX.

Деякі з обмежень на використання елементів керування Windows Forms в документах є унікальними для проектів рівня документа.

Деякі елементи керування Windows Forms видаляються з панелі елементів, якщо робочий аркуш Excel або документ Word відкриті в конструкторі Visual Studio. Це відбувається через технічні обмеження. Проекти Excel і Word підтримують всі елементи керування Windows Forms і інші компоненти, які відображаються на панелі елементів, якщо документ має фокус. Також на аркуш або в документ можна додавати сторонні елементи керування.

У панелі елементів недоступні такі елементи керування та компоненти: BindingNavigator, ContextMenuStrip, DataGrid,

DirectoryEntry, DirectorySearcher, ErrorProvider, EventLog, FileSystemWatcher, FlowLayoutPanel, GroupBox, MainMenu, MenuStrip, MessageQueue, NotifyIcon, PageSetupDialog, Panel, PerformanceCounter, PrintDialog, PrintDocument, PrintPreviewControl, Process, RichTextBox, SerialPort, ServiceController, SplitContainer, Splitter, StatusBar, StatusStrip, TabControl,TableLayoutPanel, System.Timers.Timer, System.Windows. Forms.Timer, ToolBar, ToolStrip, ToolStripContainer,

ToolStripDropDown, ToolStripDropDownMenu, ToolStripPanel

Сторонні елементи керування повинні мати атрибут ComVisibleAttribute, що дорівнює значенню true, щоб ці елементи можна було використовувати у рішенні Office.

При створенні проекту Office на основі існуючого документа Word або аркуша Excel, що містить елементи керування ActiveX, функціональні можливості елементів керування ActiveX зберігаються, проте додавання нових елементів керування ActiveX до документів в

153

Visual Studio не підтримується. Наприклад, якщо в документі Word в панелі елементів Елементи керування передбачена кнопка запуску макросу Visual Basic для додатків (VBA), виконання макросу буде продовжене після завершення використання документа в проекті Office. Проте слід видалити елементи керування ActiveX і макроси VBA і замінити їх на елементи керування Windows Forms і керований код.

6.2.1.6 Додавання елементів керування в документи Office під час виконання

Елементи керування можна додавати в документи Microsoft Office Word і книги Microsoft Office Excel, а також видаляти з них як під час розробки, так і під час виконання. Елементи керування, що додаються в документ під час виконання, називаються динамічними елементами керування. Для додавання, отримання та видалення елементів керування під час виконання використовуються допоміжні методи

Спосіб звертання до колекцій елементів керування залежить від типу проекту, що розробляється:

у проекті рівня документа для Excel використовується властивість Worksheet.Controls класів Sheet1, Sheet2 і Sheet3;

у проекті рівня документа для Word використовується

властивість Document.Controls класу ThisDocument;

— у проекті рівня застосування для Excel або Word

використовується

властивість

Controls

класів

Microsoft.Office.Tools.Excel.

Worksheet

або

Microsoft.Office.Tools.Word.Document, створених під час виконання.

Класи Microsoft.Office.Tools.Excel.ControlCollection та Microsoft. Office.Tools.Word.ControlCollection містять допоміжні методи, які можна використовувати для додавання елементів керування ведучої програми та спільних елементів керування Windows Forms в документи і на аркуші. У кожному методі використовується формат Add <клас елемента керування>.

У наступному прикладі коду показується додавання NamedRange в Sheet1 в проекті рівня документа для Excel.

Excel.Range range1 = Globals.Sheet1.Range["A1", "D5"];

154

Microsoft.Office.Tools.Excel.NamedRange namedRange1 = Globals.Sheet1.Controls.AddNamedRange (range1, "ChartSource");

За допомогою властивості Controls класу

Microsoft.Office.Tools.Excel.Worksheet або класу Microsoft.Office. Tools.Word.Document забезпечується ітерація за всіма елементама керування в документі, включаючи додані під час розробки. Елементи керування, що додаються в документ під час розробки, також називаються статичними елементами керування.

Видалити динамічні елементи керування можна шляхом виклику методу Delete елемента керування або шляхом виклику методу Remove кожної колекції Controls:

Globals.Sheet1.Controls.Remove ("ChartSource");

Під час виконання видалення статичних елементів керування неможливо. При спробі видалення статичного елемента керування за допомогою методу Delete або Remove виникатиме виняток

CannotRemoveControlException.

Уразі програмного додавання елементів керування ведучої програми в документ необхідно присвоювати кожному з них унікальне ім'я і вказати, де цей елемент керування має бути доданий в документі.

Коли документ зберігається, а потім закривається, всі динамічні створені елементи керування ведучої програми від'єднуються від відповідних подій, і події втрачають свої функції прив'язки даних.

Уразі програмного додавання елементів керування Windows Forms в документ для кожного елемента необхідно вказати розташування і унікальне ім'я. У середовищі виконання Visual Studio Tools for Office представлені допоміжні методи для кожного елемента керування. Використовуються перевантаження цих методів, до яких передаються діапазон або конкретні координати розташування елемента керування.

Коли документ зберігається, а потім закривається, всі динамічно створені елементи керування Windows Forms видаляються з цього документа. При створенні елементів керування Windows Forms за допомогою надбудови рівня застосування оболонки ActiveX для цих

155

елементів керування розташовуються зліва в документі.

Щоб додати елемент керування System.Windows.Forms.Control,

який не підтримується доступними допоміжними методами (наприклад, елемент керування користувача), слід використовувати такі методи:

у Excel слід використовувати один з методів AddControl ()

об'єкта Microsoft.Office.Tools.Excel. ControlCollection;

у Word слід використовувати один з методів AddControl ()

об'єкта Microsoft.Office.Tools.Word. ControlCollection.

Щоб додати елемент керування, передайте методу AddControl елемент керування System.Windows.Forms.Control, його розташування

іунікальне ім'я. Метод AddControl повертає об'єкт

Microsoft.Office.Tools.Excel.ControlSite (для Excel) або Microsoft. Office.Tools.Word.ControlSite (для Word), який визначає, як елемент керування взаємодіє з аркушем або документом.

У наступному прикладі коду показано порядок використання методу AddControl (Control, Range, String) для динамічного додавання елементу керування користувача на аркуш у проекті Excel рівня документа. У цьому прикладі елемент керування користувача називається UserControl1, а тип Range — range1. Щоб скористатися цим прикладом, запустіть його з класу Sheet n відповідного проекту:

UserControl1 customControl = new UserControl1 (); Microsoft.Office.Tools.Excel.ControlSite dynamicControl = this.Controls.AddControl (customControl, range1, "dynamic");

Після додавання елемента керування на аркуш або в документ за допомогою методів AddControl з'являється два різних об'єкта елементів керування: об'єкт System.Windows.Forms. Control, що представляє елемент керування користувача та об'єкт ControlSite, OLEObject або OLEControl, що представляє елемент керування після додавання на аркуш або в документ. Ці елементи керування спільно використовують багато властивостей і методів. Необхідно забезпечити звернення до таких членів за допомогою відповідного елемента керування: для звернення до властивостей та методів, що належить тільки для елементу керування користувача, використовуйте System.Windows.Forms. Control, а для звернення до загальних методів та властивостей елементів керування використовуйте об'єкти

156

OLEObject або OLEControl.

При зверненні до загальних методів або властивостей елемента керування System.Windows.Forms.Control може виникнути збій без попередження чи повідомлення, або може бути створений неприпустимий результат. Якщо необхідний метод або властивість недоступні, слід завжди використовувати методи і властивості OLEObject або OLEControl; тільки тоді можна буде посилатися на

System.Windows.Forms. Control.

Наприклад, обидва класи ControlSite і System.Windows.Forms. Control мають властивість Top. Щоб отримати або встановити відстань між верхом елемента керування і верхом документа, слід використовувати властивість Top об'єкта ControlSite, а не властивість

Top об'єкта System.Windows.Forms.Control:

//Property is set in relation to the document. dynamicControl.Top = 100;

//Property is set in relation to the container control. customControl.Top = 100;

6.2.1.7Збереження динамічних елементів керування в документах Office

Елементи керування, додані під час виконання, не зберігаються при збереженні й закритті документа або книги. Поведінка ведучих елементів керування і елементів керування Windows Forms розрізняється.

Коли документ зберігається, а потім закривається, всі динамічні ведучі елементи керування Windows Forms видаляються з цього документа. Залишаються тільки власні базові об'єкти Office.

Наприклад, елемент керування Microsoft.Office.Tools.Excel.ListObject стає елементом Microsoft.Office.Interop.Excel.ListObject. Аналогічно

об’єкти Chart та Bookmark. Microsoft.Office.Tools.Excel. NamedRange

перетворюється

на

Microsoft.Office.Interop.Excel.Range,

а

BuildingBlockGalleryContentControl,

ComboBoxContentControl,

ContentControl,

 

 

DatePickerContentControl,

DropDownListContentControl,

GroupContentControl,

PictureContentControl, PlainTextContentControl, RichTextContentControl

– на Microsoft.Office.Interop.Word. ContentControl. Власні об'єкти

157

Office не пов'язані з подіями ведучих елементів керування і не мають функції прив'язки даних, як у випадку з ведучими елементами керування.

Динамічний ведучий елемент керування можна відтворювати на місці існуючого власного елемента керування при кожному відкритті документа. Такий спосіб створення ведучих елементів керування при відкритті документа імітує очікуваний користувачем процес.

Щоб створити ведучий елемент керування

Microsoft.Office.Tools.Excel.ListObject на основі існуючого власного

об'єкта Microsoft.Office.Interop.Excel.ListObject при відкритті документа, слід використовувати метод AddListObject (ListObject) і передати йому існуючий елемент керування

Microsoft.Office.Interop.Excel. ListObject:

private Microsoft.Office.Tools.Excel.ListObject vstoListObject;

private const int DISP_E_BADINDEX = unchecked ((int) 0x8002000B);

private void Sheet1_Startup (object sender, System.EventArgs e)

{ Excel.ListObject nativeListObject = null; try

{nativeListObject = this.ListObjects.get_Item ("MyListObject");

}

catch (System.Runtime.InteropServices.COMException ex)

{// "MyListObject" does not exist.

if (ex.ErrorCode!= DISP_E_BADINDEX) throw;

}

if (nativeListObject!= null)

{ vstoListObject = this.Controls.AddListObject (nativeListObject);

}}

Для відтворення графіка Microsoft.Office.Tools.Excel.Chart

спочатку слід видалити власний об'єкт Microsoft.Office.Interop.Excel. Chart, а потім відтворити графік Microsoft.Office.Tools.Excel. Chart за

158

допомогою методу AddChart (Range, String) або AddChart (Double, Double, Double, Double, String). Методу Add <клас елемента керування>, який дозволить створити новий графік Microsoft.Office.

Tools.Excel.Chart на основі існуючого графіка Microsoft.Office.Interop.

Excel.Chart, не існує. Якщо власний об'єкт Microsoft.Office.Interop. Excel.Chart НЕ буде попередньо вилучений, отже, при повторному створенні графіка Microsoft.Office.Tools.Excel.Chart буде створений другий, дублюючий графік.

Уналаштуваннях рівня документа елементи керування та їх базові оболонки ActiveX (які використовуються для розміщення елементів керування в документі) видаляються при наступному відкритті документа. Вказівки на те, що в цьому місці були елементи керування, відсутні.

Унадбудовах на рівні додатку елементи керування видаляються, проте оболонки ActiveX залишаються в документі. Оболонки ActiveX видимі і при наступному відкритті документа. У Excel оболонки ActiveX відображають зображення зовнішнього вигляду елементів керування на момент останнього збереження документа.

При повторному відкритті документа можна відтворювати вилучені елементи керування Windows Forms. Для цього рішення має виконати такі завдання:

зберігати дані про розмір, місцезнаходження і стан елементів керування при збереженні й закритті документа. У налаштуванні рівня документа ці дані можна зберегти в кеш даних документа. У надбудові рівня застосування ці дані можна зберегти в користувальницькії XML-частині документа;

відтворити елементи керування в подію, яка викликається при відкритті документа. У проектах рівня документа можна зробити це в обробнику подій Sheet n _Startup або ThisDocument_Startup. У

проектах рівня програми це можна зробити в обробниках подій

WorkbookOpen або DocumentOpen.

При додаванні динамічних елементів керування Windows Forms в документи за допомогою надбудови можна уникнути появи в документі оболонок ActiveX для елементів керування при повторному відкритті документа.

Щоб видалити всі оболонки ActiveX, необхідно викликати

159

метод GetVstoObject для створення ведучого елементу для об'єктів

Microsoft.Office.Interop.Word.Document або Microsoft.Office.Interop. Excel.Workbook, що представляють знову відкритий документ. Наприклад, щоб видалити всі оболонки ActiveX з документа Word, можна викликати метод GetVstoObject для створення ведучого елементу об'єкта Document, переданого в обробник подій для події

DocumentOpen.

Дана процедура має сенс, якщо відомо, що документ буде відкриватися тільки на комп'ютерах з встановленою надбудовою. Якщо документ буде передаватися іншим користувачам, на комп'ютерах яких не встановлена надбудова, рекомендується замість цього видалити елементи керування перед закриттям документа.

Наступний приклад коду демонструє виклик методу GetVstoObject під час відкриття документа:

private void Application_DocumentOpen_ClearActiveXWrappers (Word.Document Doc)

{ Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject (Doc);

}

Хоча метод GetVstoObject використовується в основному для створення нових ведучих елементів керування під час виконання, за допомогою даного методу можна також видалити всі оболонки ActiveX з документа при першому виклику методу для конкретного документа.

Зверніть увагу, що у разі, якщо надбудова створює динамічні елементи керування при відкритті документа, вона також викличе метод GetVstoObject в ході процесу створення елементів керування. У рамках даного скрипта необов'язково додавати окремий виклик методу GetVstoObject, щоб видалити всі оболонки ActiveX.

Надбудова може явно видалити всі динамічні елементи керування з документа перед його закриттям. Дана процедура має сенс у тому випадку, якщо документи завідомо будуть передаватися користувачам, на комп'ютерах яких не встановлена надбудова.

Наступний приклад коду демонструє видалення всіх елементів керування Windows Forms з документа Word перед його закриттям.

160

void Application_DocumentBeforeClose (Word.Document Doc, ref bool Cancel)

{ bool isExtended = Globals.Factory.HasVstoObject (Doc); if (isExtended)

{ Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject (Doc);

System.Collections.ArrayList controlsToRemove = new System.Collections.ArrayList ();

foreach (object control in vstoDocument.Controls)

{if (control is System.Windows.Forms.Control)

{controlsToRemove.Add (control);

}

}

foreach (object control in controlsToRemove) { vstoDocument.Controls.Remove (control);

}

}

}

6.2.2 Елементи керування Windows Forms у документах

Word

Елементи керування Windows Forms можна додавати в документи Microsoft Office Word тим же способом, яким вони додаються у форми Windows Forms. Однак існують відмінності в поведінці елементів керування Windows Forms в документах.

У Word існують деякі особливості. Якщо елемент керування Windows Forms додається в документ Word в проекті рівня документа за допомогою конструктора Visual Studio, використовується стиль обтікання "У тексті". Щоб змінити стиль макета елемента керування, у контекстному меню виберіть Формат об'єкта. Виберіть стиль обтікання на сторінці Макет діалогового вікна Формат об'єкта.

При додаванні елемента керування в документ Word під час виконання можна задати стиль макета нового елемента керування, використовуючи інші перевантаження методу Add<клас елемента

керування> Microsoft.Office.Tools.Word. ControlCollection:

— для додавання елемента керування зі стилем обтікання "У тексті" слід використовувати перевантаження методу, що приймає діапазон Range, який вказує розміщення елемента керування;