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

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

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

121

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

Класи аркушів забезпечують доступ до учасників класу ведучого елементу Worksheet і призначені для виконання основних завдань з налаштування, наприклад, для зміни вмісту книги. Ці класи також можна використовувати для додавання в книгу елементів керування та смарт-тегів. Використовуючи різні поєднання елементів керування та коду, можна пов'язувати елементи керування з даними, збирати відомості, що вводяться користувачем, і реагувати на дії користувача.

Класи книги надають розташування, у якому можна почати створення коду проекту. Оскільки цей клас надає ті ж властивості,

методи і події, що і об'єкт Microsoft.Office.Interop.Excel.Worksheet в

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

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

Упроекті рівня документа можна перейменувати аркуші в конструкторі Visual Studio, але при цьому зміниться тільки коротке ім'я аркуша. Програмним ім'ям залишається ім'я аркуша, задане за замовчуванням. При перейменуванні аркуша у вікні Властивості змінюється лише програмне ім'я.

Упроекті рівня документа неможливе створення нових ведучих елементів Worksheet. При створенні нового аркуша Excel під час виконання йому присвоюється тип Microsoft.Office.Interop.Excel. Worksheet. Оскільки такий документ не є ведучим елементом, він не може містити елементи керування ведучої програми або Windows

Forms.

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

Microsoft.Office.Interop.Excel. Worksheet.

Щоб створити ведучий елемент Worksheet, використовуйте метод GetVstoObject.

122

5.2.1.3 Ведучі елементи ChartSheet

Ведучий елемент ChartSheet є робочим аркушем Excel, який містить лише діаграму і надає доступ до подій.

Коли в якості нового аркуша в проект налаштування на рівні документа Microsoft Office Excel в режимі розробки додається аркуш діаграм, Visual Studio автоматично створює ведучий елемент

ChartSheet.

Хоча ведучий елемент ChartSheet є аркушем Excel, на нього не можна додавати будь-які елементи керування. Якщо потрібно використовувати інші елементи керування на аркуші з діаграмою, не використовуйте аркуш діаграм. Замість цього можна помістити діаграму як впроваджений об'єкт на аркуш за допомогою елемента керування ведучої програми Chart.

5.2.2 Елементи керування діаграмою

Елемент керування Chart – це об'єкт діаграми, що надає події. При додаванні діаграми на аркуш Visual Studio створює об'єкт Chart, який можна запрограмувати безпосередньо, не звертаючись до об'єктної моделі Microsoft Office Excel.

Можна додати елементи керування Chart на аркуш Microsoft Office Excel під час розробки або під час виконання в проектах на рівні документа.

У надбудові рівня застосування елементи керування Chart додаються на аркуш під час виконання.

Всі форматування, що застосовується до елемента

Microsoft.Office.Interop.Excel.Chart, можна також застосовувати і до елементу керування Microsoft.Office.Tools.Excel.Chart. Це включає межі, шрифти, тип діаграми, сітки, позначення та підписи даних.

Для елемента керування Chart доступні наступні події: ActivateEvent, BeforeDoubleClick, BeforeRightClick, BindingContextChanged, Calculate, Deactivate, Disposed, DragOver, DragPlot, MouseDown, MouseMove, MouseUp, Resize, SelectEvent,

SeriesChange

Можна додати елементи керування Chart на аркуш Microsoft Office Excel в налаштуваннях рівня документа під час розробки і під час виконання. Під час виконання також можна додати елементи

123

керування Chart у надбудови рівня застосування.

Можна додати елемент керування Chart до аркуша так само, як додають діаграму з програми. Для додавання елемента керування діаграми на аркуш Excel на вкладці Вставлення у групі Діаграми натисніть на пункт Стовпець, виберіть категорію діаграми і потім потрібний тип діаграми, на вкладці Конструктор у групі Дані натисніть на пункт Вибір даних. Потім у діалоговому вікні Вибір джерела даних у вікні Діаграма натисніть на пункт Діапазон даних і очистіть все вибране за замовчуванням. На аркуші Дані для діаграми виберіть діапазон комірок, який містить дані для діаграми.

В проектах рівня документа можна додавати елементи керування Chart динамічно під час виконання:

Microsoft.Office.Tools.Excel.Chart employeeData; employeeData = this.Controls.AddChart (25, 110, 200, 150,

"employees");

employeeData.ChartType = Excel.XlChartType.xl3DPie;

Excel.Range chartRange = this.Get_Range ("A5", "D8"); employeeData.SetSourceData (chartRange, missing);

Елемент керування Chart можна програмними засобами додавати на будь-який відкритий аркуш в проекті надбудови рівня застосування:

private void AddChart ()

{ Worksheet worksheet = Globals.Factory.GetVstoObject ( Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet); Excel.Range cells = worksheet.Range["A5", "D8"];

Chart chart = worksheet.Controls.AddChart (cells, "employees");

chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xl3DPie;

chart.SetSourceData (cells, missing);

}

5.2.3 Елементи керування ListObject

Елемент керування ListObject є списком з подіями і можливістю

124

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

Excel.

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

Елемент керування ListObject підтримує просту і складну прив'язку даних. Елемент керування ListObject можна прив'язати до джерела даних за допомогою властивостей DataSource і DataMember під час розробки або за допомогою методу SetDataBinding під час виконання.

Якщо елемент керування ListObject прив'язаний до джерела даних, при зміні даних у якому події не виникають, то для оновлення елемента керування ListObject необхідно викликати метод

RefreshDataRow або RefreshDataRows.

При додаванні в комірку аркуша елемента керування ListObject шляхом зіставлення з цією коміркою повторюваного елемента схеми Visual Studio автоматично зіставляє ListObject зі створеним набором даних. Однак елемент керування ListObject не прив'язується до даних автоматично. Можна прив'язати елемент керування ListObject до набору даних в проекті рівня документа під час розробки або під час виконання. Можна програмно виконати прив'язку елемента керування ListObject до набору даних в надбудові рівня застосування під час виконання.

Оскільки дані відокремлені від елемента керування ListObject, додавати і видаляти дані слід через прив'язаний набір даних, а не безпосередньо через елемент керування ListObject. Якщо дані в прив'язаному наборі оновлюються, зміни відображаються в елементі керування ListObject автоматично.

Щоб швидко заповнити елемент керування ListObject даними, прив'яжіть його до джерела даних. При зміні даних у прив'язаному до даних елементі керування ListObject ці зміни автоматично вносяться до джерела даних. Якщо необхідно заповнити даними елемент керування ListObject і дозволити користувачеві змінювати дані в елементі керування ListObject, не змінюючи при цьому джерело даних, викличте метод Disconnect, щоб відключити елемент керування

125

ListObject від джерела даних.

Якщо спочатку був прив'язаний елемент керування ListObject, а потім викликаний метод ReadXml для заповнення набору даних, то зчитування XML-файла в цей елемент керування відбувається досить повільно. Для поліпшення продуктивності рекомендується спочатку викликати метод ReadXml, а потім прив'язувати елемент керування.

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

При прив'язці даних до елементу керування ListObject, доданого до документа під час розробки, Visual Studio відстежує стовпець і рядок при кожному збереженні книги. Якщо користувач переміщує стовпчики чи рядки об'єкта ListObject під час виконання, то новий порядок зберігається при наступному відкритті книги, а елемент керування ListObject повторно виконує прив'язку до джерела даних.

Щоб відновити для ListObject вихідний порядок стовпців і рядків, необхідно викликати метод ResetPersistedBindingInformation.

Цей метод видаляє користувацькі властивості документа, пов'язані з порядком стовпців і рядків зазначеного об'єкта ListObject. Викличте цей метод з події книги Shutdown, якщо збереження порядку стовпців і рядків ListObject не потрібно.

Форматування, що застосовується до елемента

Microsoft.Office.Interop.Excel.ListObject, можна застосовувати і до

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

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

126

перевіряти дані.

Іноді зв'язок об'єкта списку з джерелом даних викликає помилки виконання. Наприклад, можна вказати, які стовпці будуть відображатися в елементі керування ListObject, щоб якщо опустити стовпці з обмеженнями, такими як поле, яке не може приймати нульові значення, помилки будуть виникати щоразу при створенні рядка. Можна написати код для додавання відсутніх значень в обробнику подій для події ErrorAddDataBoundRow.

Застосування Excel дозволяє користувачам перейменовувати таблиці Excel під час виконання за допомогою вкладки Конструктор. Однак елемент керування ListObject не підтримує цю можливість. Якщо користувач намагається перейменувати таблицю Excel, відповідну елементу керування ListObject, при збереженні книги цієї таблиці автоматично присвоюється початкове ім'я.

Для елемента керування ListObject доступні наступні події:

BeforeAddDataBoundRow,

BeforeDoubleClick,

BeforeRightClick,

BindingContextChanged,

Change,

DataBindingFailure,

DataMemberChanged,

DataSourceChanged,

 

Deselected,

ErrorAddDataBoundRow,

OriginalDataRestored,

Selected,

SelectedIndexChanged, SelectionChange.

Можна додати елементи керування ListObject на аркуш Microsoft Office Excel під час розробки і під час виконання в проектах на рівні документа. Також можна додати елементи керування ListObject під час виконання в проектах надбудов рівня застосування.

Існує кілька способів додавання елементів керування ListObject на аркуш в проекті рівня документа під час розробки: з Excel, з панелі елементів Visual Studio і з вікна Джерела даних.

За першого способу на вкладці Вставлення у групі Таблиці натисніть кнопку Таблиця та виділіть клітинки, які необхідно включити до списку.

За використання панелі елементів зі вкладки Елементи керування Excel панелі елементів перетягніть елемент керування ListObject в клітинку на аркуш і за допомогою діалогового вікна виділіть клітинки, які необхідно включити до списку. Якщо необхідно присвоїти елементу керування ім'я, відмінне від імені за замовчуванням, змініть його у вікні Властивості.

За третього способу відкрийте вікно Джерела даних і створіть джерело даних для проекту. Перетягніть таблицю з вікна Джерела

127

даних на аркуш. Елемент керування прив'язкою даних ListObject додається на аркуш.

Можна додавати елементи керування ListObject динамічно під час виконання. Це дозволяє створювати елементи керування ведучої програми при виникненні певних подій.

Уобробнику подій Startup об'єкта Sheet1 вставте наступний код,

вякому елемент керування ListObject додається в комірку з A1 по A4:

Microsoft.Office.Tools.Excel.ListObject employeeData; employeeData = this.Controls.AddListObject (this.get_Range

("$A$1:$D$4", missing), "employees");

Елемент керування ListObject можна програмними засобами додавати на будь-який відкритий аркуш в проекті рівня застосування. У наступному прикладі коду спочатку на основі відкритого аркуша створюється ведучий елемент аркуша, а потім в комірки від A1 до A4 додається елемент керування ListObject:

private void AddListObject ()

{ Worksheet worksheet = Globals.Factory.GetVstoObject ( Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);

Microsoft.Office.Tools.Excel.ListObject list1; Excel.Range cell = worksheet.Range["$ A $ 1: $ D $ 4",

missing];

list1 = worksheet.Controls.AddListObject (cell, "list1");

}

Можна вказати розмір елемента керування ListObject під час додавання його до книги Microsoft Office Excel, або змінити його розмір пізніше. Наприклад, можна змінити кількість стовпців списку.

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

Щоб змінити розмір списку під час розробки, натисніть і перетягніть один із маркерів зміни розміру, або перевизначте розмір у діалоговому вікні Зміна розміру списку, для чого натисніть правою кнопкою миші елемент керування ListObject, вкажіть на пункт Аркуш,

128

а потім виберіть команду Змінити розмір списку в контекстному меню та оберіть комірки, які будуть використані для визначення розміру списку.

Можна змінити розмір елемента керування ListObject під час виконання в проекті рівня документа, викликавши метод Resize. Цей метод не можна використовувати для переміщення елемента керування ListObject в нове положення на аркуші. Заголовки повинні залишатися на одному рядку і елемент керування ListObject, що має новий розмір, повинен перекривати первісний об'єкт списку. Елемент керування ListObject, розмір якого змінено, повинен містити один рядок заголовка і не менш одного рядка даних.

Щоб змінити розмір об'єкта списку програмним способом:

Microsoft.Office.Tools.Excel.ListObject list1 = this. Controls.AddListObject (this.Range["A1", "B3"], "list1"); list1.Resize (this.Range["A1", "C5"]);

Розмір елемента керування ListObject можна змінювати на будьякому відкритому аркуші під час виконання в проекті рівня застосування:

Worksheet worksheet = Globals.Factory.GetVstoObject (Application.ActiveSheet);

Microsoft.Office.Tools.Excel.ListObject list1;

list1 = worksheet.Controls.AddListObject (worksheet.Range ["$ A $ 1: $ B $ 3", missing], "MyListObject"); list1.Resize (worksheet.Range["A1", "C5"]);

Користувачі можуть додавати нові рядки в елемент керування ListObject, пов'язаний з даними. Можна перевіряти дані користувача перед прийняттям змін у джерелі даних.

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

Створимо змінну для ідентифікатора і DataTable на рівні класу:

129

private int id = 0;

private System.Data.DataTable employeeTable;

Додамо приклад стовпця і дані в подію Startup класу Sheet1 (у проекті на рівні документа) або ThisAddIn (у проекті на рівні додатку):

employeeTable = new System.Data.DataTable ("Employees"); System.Data.DataColumn column = employeeTable.Columns.Add ("Id", typeof (int)); column.AllowDBNull = false; employeeTable.Columns.Add (" FirstName ", typeof (string)); employeeTable.Columns.Add (" LastName ", typeof (string)); employeeTable.Columns.Add (" Age ", typeof (int)); employeeTable.Rows.Add (id," Nancy "," Anderson "," 56 "); employeeTable.Rows.Add (id," Robert "," Brown "," 44 "); id ++; list1.SetDataBinding (employeeTable," "," FirstName "," LastName "," Age "); list1.BeforeAddDataBoundRow += new Microsoft.Office.Tools.Excel. BeforeAddDataBoundRowEventHandler (list1_BeforeAddDataBoundRow);

Додайте наступний код до обробника подій list1_BeforeAddDataBoundRow, щоб перевіряти відповідність віку вказаному діапазону:

private void list1_BeforeAddDataBoundRow (object sender,Microsoft.Office.Tools.Excel.BeforeAddDataBoundRowEventArgs e) { System.Data.DataRow row = ((System.Data.DataRowView) e.Item).Row;

if (row["Age"]!= null && row["Age"]!= Convert.DBNull) { int ageEntered = (int) row["Age"];

if (ageEntered <21 | | ageEntered> 65) { System.Windows.Forms.MessageBox.Show

("Age must be between 21 and 65. The row cannot be added."); e.Cancel = true;

return;

}

row["ID"] = id; id ++;

}

else

130

{ System.Windows.Forms.MessageBox.Show ("You must enter an age.");

e.Cancel = true;

}

}

При прив'язці елемента керування ListObject до елементу керування DataTable може знадобитися приховати частину стовпців у списку, або залишити частину стовпців без прив'язки до даних. Вказати, які стовпці будуть відображатися в елементі керування

ListObject, можна при виклику методу SetDataBinding.

Для зіставлення таблиці даних зі стовпцями у списку створіть на рівні класу об'єкт DataTable:

System.Data.DataTable table = new System.Data.DataTable ("Employees");

Додайте стовпці зразків в обробник подій Startup класу Sheet1 (для проекту рівня документа) або класу ThisAddIn (для проекту рівня застосування).

table.Columns.Add ("Id", typeof (int)); table.Columns.Add ("FirstName", typeof (string)); table.Columns.Add ("LastName", typeof (string)); table.Columns.Add ("Title", typeof (string)); table.Rows.Add (1, "Nancy", "Anderson", "Sales

Representative");

table.Rows.Add (2, "Robert", "Brown", "Sales Representative");

Викличте метод SetDataBinding і передайте в якості параметрів імена стовпців в порядку їх відображення. Об'єкт списку буде прив'язаний до новоствореного об'єкту DataTable, однак порядок стовпців в об'єкті списку буде відрізнятися від порядку їх відображення в об'єкті DataTable:

this.list1.AutoSetDataBoundColumnHeaders = true; this.list1.SetDataBinding (table, "", "Title", "LastName",

"FirstName");