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

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

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

71

розмірами елементів керування.

Щоб налаштувати джерело даних, додайте код в обробник подій Load елемента керування панелі дій для заповнення елемента керування даними з об'єкта DataTable, а також задайте властивості DataSource і DataMember для кожного елемента керування:

private void ActionsControl_Load (object sender, EventArgs e)

{ this.suppliersTableAdapter.Fill (this.northwindDataSet.Suppliers);

this.productsTableAdapter.Fill

(this.northwindDataSet.Products);

}

Приєднати обробник події Load (даний код можна помістити в конструктор ActionsControl після звернення до InitializeComponent):

this.Load += new EventHandler (ActionsControl_Load);

Для встановлення властивостей прив'язки даних елементів керування виконайте наступне:

виберіть елемент керування CompanyNameComboBox;

у вікні Властивості натисніть кнопку праворуч від властивості

DataSource і виберіть suppliersBindingSource;

натисніть кнопку праворуч від властивості DisplayMember і

виберіть CompanyName;

розгорніть властивість DataBindings, натисніть кнопку праворуч від властивості Text і виберіть None;

виберіть елемент керування ProductNameListBox;

у вікні Властивості натисніть кнопку праворуч від властивості

DataSource і виберіть productsBindingSource;

натисніть кнопку праворуч від властивості DisplayMember і

виберіть ProductName;

розгорніть властивість DataBindings, натисніть кнопку праворуч від властивості SelectedValue і виберіть None.

Наступним завданням є читання даних з пов'язаних елементів керування і заповнення таблиці в документі Word. Спершу слід створити процедуру для форматування заголовків таблиці, а потім

72

додати метод AddData для створення та форматування таблиці Word. У класі ActionsControl створіть метод для форматування

заголовків таблиці.

static void SetHeadings (Microsoft.Office.Interop.Word.Cell tblCell, string text)

{tblCell.Range.Text = text; tblCell.Range.Font.Bold = 1;

tblCell.Range.ParagraphFormat.Alignment = Microsoft.Office. Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;

}

У класі ActionsControl створіть метод для створення таблиці і додавання до неї даних з панелі дій:

private void AddData (System.Data.DataRow row, string companyName)

{ object missing = System.Type.Missing;

if (Globals.ThisDocument.Tables.Count == 0)

{try

{Microsoft.Office.Interop.Word.Table tbl = Globals.ThisDocument.Tables.Add(Globals.ThisDocument.Applica tion.Selection.Range, 1, 4, ref missing, ref missing);

SetHeadings (tbl.Cell (1, 1), "Company Name"); SetHeadings (tbl.Cell (1, 2), "Product Name"); SetHeadings (tbl.Cell (1, 3), "Quantity"); SetHeadings (tbl.Cell (1, 4), "Unit Price");

}

catch (Exception ex)

{MessageBox.Show ("Problem creating Products table:" + ex.Message, "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Microsoft.Office.Interop.Word.Selection selection = Globals.ThisDocument.Application.Selection;

if (selection.Tables.Count> 0)

{Microsoft.Office.Interop.Word.Row newRow = Globals.ThisDocument.Tables[1]. Rows.Add (ref missing);

newRow.Range.Font.Bold = 0;

73

newRow.Range.ParagraphFormat.Alignment = Microsoft.Office. Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft;

newRow.Cells[4]. Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignPa ragraphRight;

newRow.Cells[1]. Range.Text = companyName; newRow.Cells[2]. Range.Text = row["ProductName"]. ToString

();

newRow.Cells[3]. Range.Text = row["QuantityPerUnit"]. ToString ();

newRow.Cells[4]. Range.Text = Math.Round (Convert. ToDouble (row["UnitPrice"])). ToString ("#, # # 0.00");

}

else

{ MessageBox.Show ("Cursor must be within a table.", "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Для вставки тексту в таблицю Word у обробник подій Click кнопки Insert додайте наступний код:

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

{System.Data.DataTable tbl = northwindDataSet.Products; System.Data.DataRow[] rows;

if (this.productNameListBox.SelectedIndex> = 0)

{System.Data.DataRowView productRow = (System.Data. DataRowView) this.ProductNameListBox.SelectedItem;

string product = productRow.Row["ProductName"]. ToString ();

string company = this.companyNameComboBox.Text; rows = tbl.Select ("[ProductName] = '" +

product.Replace ("'", "''") + "'"); this.AddData (rows[0], company);

}

else

{MessageBox.Show ("Please select a product.", "Actions Pane", MessageBoxButtons.OK);

}}

74

Необхідно створити обробник подій Click кнопки (даний код можна помістити в оброблювач подій Load класу ActionsControl):

this.Insert.Click += new EventHandler (Insert_Click);

Для відображення панелі дій створіть новий екземпляр елемента керування на початку класу ThisDocument, як показано в наступному прикладі:

private ActionsControl actions = new ActionsControl ();

Додайте код в обробник подій Startup класу ThisDocument, щоб він виглядав наступним чином:

this.ActionsPane.Controls.Add (actions);

3.2.1.7 Прив'язка даних до елементів керування в панелі дій

Excel

У цьому покроковому керівництві демонструється прив'язка даних до елементів керування в панелі дій Microsoft Office Excel. Елементи керування демонструють відношення "основний-детальний" між таблицями в базі даних SQL Server.

Створіть проект книги Excel з ім'ям MyExcelActionsPane та виконайте дії, аналогічні для Word, встановивши прапорець поруч із таблицею Постачальники та розкривши таблицю Продукти і

вибравши ProductName, SupplierID, QuantityPerUnit і UnitPrice.

Потім додайте до першого аркушу елементи керування

NamedRange і ListObject:

переконайтеся, що в конструкторі Visual Studio відкрита книга Моя панель дій Excel.xls і відображається Sheet1;

розгорніть таблицю Постачальники у вікні Джерела даних;

натисніть на стрілку вниз на вузлі Назва компанії та виберіть

пункт NamedRange;

− перетягніть вузол Ім'я компанії з вікна Джерел даних у комірку A2 на аркуші Sheet1: створюється елемент керування NamedRange з ім'ям CompanyNameNamedRange і в комірці A2 з'являється текст <CompanyName>, в проект додаються елемент керування

75

BindingSource з ім'ям suppliersBindingSource, адаптер таблиць і екземпляр класу DataSet, при цьому елемент керування пов'язаний з об'єктом BindingSource, який, у свою чергу, пов'язаний з екземпляром

DataSet;

у вікні Джерела даних перейдіть до стовпців під таблицею Постачальники. У нижній частині списку розташовується таблиця Продукти, яка є дочірньою по відношенню до таблиці Постачальники. Виберіть дочірню таблицю Продукти (не розташовану на одному рівні

зтаблицею Постачальники) і натисніть стрілку списку, що розкривається;

виберіть в списку, що розкривається, елемент керування ListObject і перетягніть таблицю Продукти в комірку A6 аркуша Sheet1: укомірці А6 буде створений елемент керування ListObject з ім'ям ProductNameListObject, в проект додається елемент керування

BindingSource з ім'ям productsBindingSource та адаптер таблиць, при цьому елемент керування пов'язаний з об'єктом BindingSource, який, у свою чергу, пов'язаний з екземпляром DataSet;

− виберіть suppliersBindingSource в області компонентів і змініть значення властивості Modifiers на Internal у вікні Властивості.

Після цього потрібно додати елемент керування ActionsControl панелі дій, що містить поле зі списком.

Для додавання прив'язаних до даних елементів керування Windows Forms в елемент керування панелі дій перетягніть елемент керування ComboBox на елемент керування панелі дій, змініть значення властивості Size на 171, 21 та змініть розмір елементу керування користувача відповідно до розмірів поля зі списком.

Джерело даних елемента керування ComboBox задається таким же, як у елемента керування NamedRange на аркуші.

Для встановлення властивостей прив'язки даних елемента керування додайте наступний код в подію Load елемента керування панелі дій:

private void ActionsControl_Load (object sender, EventArgs e)

{ this.comboBox1.DataSource = Globals.Sheet1.suppliersBindingSource;

this.comboBox1.DisplayMember = "CompanyName";

}

76

Створіть обробник події ActionsControl:

public ActionsControl ()

{InitializeComponent ();

this.Load += new EventHandler (ActionsControl_Load);

}

Створіть новий екземпляр елементу керування користувача в класі ThisWorkbook:

ActionsControl actions = new ActionsControl ();

У обробник подій Startup ThisWorkbook додайте елемент керування в панель дій:

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

{ this.ActionsPane.Controls.Add (actions);

}

3.2.2 Створення налаштовуваної області задач 3.2.2.1 Загальні відомості про налаштовувані області задач

Області задач – це області користувальницького інтерфейсу, які зазвичай прикріплюються до однієї сторони вікна програми Microsoft Office. За допомогою налаштовуваних областей задач можна створити власну область завдань і надати користувачам знайомий інтерфейс для доступу до функціональних можливостей рішення. Наприклад, інтерфейс може містити елементи керування, які виконують код для зміни документів або відображення даних з джерела.

До переваг налаштовуваної області задач належить те, що вона дозволяє інтегрувати функції в знайомий користувальницький інтерфейс, який дозволяє використовувати конструктор Windows Forms, а інструменти Visual Studio дозволяють швидко створювати персоналізовану область завдань.

Створити основну персоналізовану область завдань можна в два етапи:

− створити користувальницький інтерфейс для налаштовуваної

77

області задач, додавши елементи керування Windows Forms до об'єкта

UserControl;

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

Всі налаштовувані області задач, створені за допомогою засобів розробки Office в Visual Studio, містять об'єкт UserControl, який надає користувальницький інтерфейс області задач, що налаштовується. Елемент керування користувача можна створювати під час розробки або під час виконання. Якщо користувацький елемент керування створюється під час розробки, для створення користувацького інтерфейсу для області задач може використовуватися конструктор

Windows Forms.

Після створення елементу керування користувача, що включає користувальницький інтерфейс області задач, що налаштовується, необхідно створити CustomTaskPane. Для цього необхідно передати елемент керування користувача CustomTaskPaneCollection в надбудові шляхом виклику методу Add. Колекція перетворюється у поле

CustomTaskPanes класу ThisAddIn. Наступний приклад коду призначений для виконання з класу ThisAddIn:

myUserControl1 = new MyUserControl (); myCustomTaskPane = this.CustomTaskPanes.Add

(myUserControl1, "My Task Pane"); myCustomTaskPane.Visible = true;

Методи Add повертають новий об'єкт CustomTaskPane. Цей об'єкт може використовуватися для зміни зовнішнього вигляду області задач і відповіді на користувальницькі події.

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

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

— щоб зв'язати область завдань з активним вікном,

78

використовуйте метод CustomTaskPaneCollection. Add(UserControl,

String);

— щоб зв'язати область завдань з документом, розміщеним у певному вікні, скористайтеся методом CustomTaskPaneCollection.Add

(UserControl, String, Object).

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

При необхідності автоматизації додатки з елементу керування користувача можна отримати прямий доступ до об'єктної моделі за

допомогою Globals.ThisAddIn.Application.

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

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

Якщо налаштовувана область задач створюється в надбудові, необхідно також створити елемент користувацького інтерфейсу, наприклад, кнопку, щоб користувачі могли з її допомогою відображати або приховати персоналізовану область завдань. При створенні налаштовуваної області задач у застосуванні Microsoft Office, яке підтримує налаштування стрічки, до стрічки можна додати групу керування та кнопку для відображення персоналізованої області завдань.

При створенні налаштовуваної області задач у застосуванні Microsoft Office, яке не підтримує налаштування стрічки, можна додати елемент CommandBarButton, що відображує або приховує персоналізовану область задач.

Керувати розміром або розташуванням налаштовуваної області задач можна за допомогою властивостей об'єкта CustomTaskPane. Зокрема щоб змінити розташування налаштовуваної області задач використовуйте DockPosition, а для того щоб запобігти змінам розташування області задач – DockPositionRestrict. Інші зміни у зовнішній вигляд налаштовуваної області задач можна вносити за

79

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

BackgroundImage.

За допомогою відповідних параметрів можна активувати відповідь надбудови на зміни в налаштовуваній області задач.

Наприклад: DockPositionChanged та VisibleChanged.

Після створення налаштовуваної області задач об'єкт CustomTaskPane зберігається в пам'яті на час виконання надбудови. Об'єкт буде зберігатися в пам'яті і при закритті області задач.

Для очищення ресурсів, використовуваних областю задач під час виконання надбудови, використовуйте методи Remove або RemoveAt, які дозволяють видалити вибраний об'єкт CustomTaskPane з колекції CustomTaskPanes і зробити виклик методу Dispose () об'єкта. Середовище виконання Visual Studio Tools for Office автоматично очищає ресурси, які використовувалися областю задач, при розвантаженні надбудови. Не слід викликати методи Remove або RemoveAt в обробнику події ThisAddIn_Shutdown проекту. Ці методи створюють виняток ObjectDisposedException, оскільки середовище виконання Visual Studio Tools for Office очищає ресурси, використані

об'єктом CustomTaskPane, до виклику ThisAddIn_Shutdown.

3.2.2.2 Керування налаштовуваними областями завдань у декількох вікнах додатків

При створенні налаштовуваної області задач у застосуванні, в якому для відображення документів та інших елементів використовуються декілька вікон, необхідно вжити додаткові дії для того, щоб ця область завдань залишалася видимою тоді, коли вона може знадобитися користувачеві.

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

Outlook;

Word, InfoPath і PowerPoint 2010;

Excel і PowerPoint 2007.

80

У додатках Word, InfoPath і PowerPoint 2010 кожен документ відображається в окремому вікні фрейму документа. При створенні налаштовуваної області задач для цих додатків вона зіставляється тільки з певним документом. Якщо користувач відкриває інший документ, область задач буде прихованою до тих пір, поки не буде відображений попередній документ.

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

Щоб зв'язати область завдань з конкретним вікном документа,

використовуйте метод CustomTaskPaneCollection.Add (UserControl, String, Object) для створення області задач і передайте об'єкт

Microsoft.Office.Interop.Word.Window (InfoPath.WindowObject для

InfoPath, PowerPoint.DocumentWindow для PowerPoint).

Щоб відстежувати стан вікон документа у Word, можна обробляти наступні події: DocumentBeforeClose, DocumentOpen,

NewDocument, WindowActivate, WindowDeactivate.

У додатках Excel і PowerPoint 2007 для всіх документів (книги та презентації) створюється одне вікно фрейма документа. При створенні налаштовуваної області задач у цих додатках вона доступна для кожного відкритого в додатку документа. При цьому не потрібно ніяких додаткових дій, щоб забезпечити відображення області задач для кожного документа.

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

Щоб відстежувати стан книг в додатку Excel, можна обробляти наступні події: NewWorkbook, WindowActivate, WindowDeactivate,

WorkbookActivate, WorkbookDeactivate, WorkbookOpen.

У наступному прикладі коду показано, як приховати або