Расширение функциональности ролеориентированного клиента NAV 2009 с помощью подключаемых компонентов. Пример 2.1. Мини браузер
В данной статье продолжим работу с подключаемыми компонентами – новой возможности, появившейся в Dynamics NAV 2009 SP1. В предыдущей статье обещались чудеса, а показали всего лишь динамическое форматирование. В данной же статье все будет серьезней.
Начнем с того, что откроем Visual Studio 2008 и создадим новый C# - проект типа Class Library (File > New > Project). В открывшемся окне New Project введите название проекта. Microsoft рекомендует использовать следующий формат имени: МояКомпания.МойПродукт.RtcAddins.
Т.е. все подключаемые компоненты, связанные с одним продуктом (например, аддоном), рекомендуется помесщать в одну библиотеку.
И если в прошлой статье мы практически не соблюдали рекомендации, то в этой сделаем шаг навстречу стандартам и назовем проект: NAV4U.WebAddin.
До идеала пока далеко, но однозначно лучше, чем полный хаос.
Далее нужно добавить ссылки на ряд сборок, которые будут использованы в нашем проекте. Для этого нужно щелкнуть Project > Add Reference. Откроется окно Add Reference.
На закладке .NET выберите и добавьте ссылки на сборки, которые отвечают за базовую графическую функциональность и создание Windows интерфейса:
- System.Drawing
- System.Windows.Forms
Кроме этого нужно добавить ссылку на библиотеку Microsoft.Dynamics.Framework.UI.Extensibility.dll. Эта библиотека содержит реализацию интерфейсов для подключения компонентов. Для этого нужно щелкнуть Project > Add Reference, перейти на закладку Browse и выбрать нужную библиотеку.
Итак, сейчас перед нами открыто окна для редактирования кода – Class1.cs. Class1.cs – это один из файлов входящих в проект. В проекте может быть несколько файлов это позволяет лучше управляться со структурой проекта. В данной статье мы используем эту возможность. Понятно, что в многофайловом проекте такое имя файла как class1 просто недопустимо.
Переименуем файл, для этого в окне Solution Explorer щелкните правой клавишей по файлу Class1.cs и выберите пункт Rename. Введите новое имя файла - WebAddin.cs
Примечание. Чтобы вывести на экран окно Solution Explorer щелкните View > Solution Explorer (или воспользуйтесь комбинацией клавиш Ctrl + Alt + L).
В этом файле у нас будет находиться класс реализующий элемент управления. Добавьте определение класса в пространство имен NAV4U.WebAddin
[ControlAddInExport("NAV4U.WebAddin")] public class WebAddin : WinFormsControlAddInBase { protected override Control CreateControl() { var control = new apWebBrowser(); control.MaximumSize = new Size(400, 200); control.ScrollBarsEnabled = false; control.ScriptErrorsSuppressed = true; control.WebBrowserShortcutsEnabled = false; return control; } }
Примечание. Не забудьте добавить using директиву для Microsoft.Dynamics.Framework.UI.Extensibility, Microsoft.Dynamics.Framework.UI.Extensibility.WinForms, System.Windows.Forms, System.Drawing.
Перед определением класса обязательно следует использовать атрибут ControlAddInExport с указанием названия подключаемого компонента (если рекомендуемый формат названия библиотеки - МояКомпания.МойПродукт.RtcAddins, то для названия самого компонента рекомендуется применять формат - МояКомпания.МойПродукт.МойКомпонент).
Обратите внимание, что в отличие от предыдущего примера в данном случае класс создается на базе класса WinFormsControlAddInBase, а не StringControlAddInBase.
Класс StringControlAddInBase является более “продвинутым” - он не только поддерживает отображение компонента, но также обеспечивает обмен данными между компонентом и ролеориентированным клиентом, и может вызывать триггер OnControlAddIn. Однако в данном примере эти возможности не нужны, поэтому будет использован более простой класс WinFormsControlAddInBase.
Примечание. Не пытайтесь на данном этапе использовать StringControlAddInBase, единственное чего вы добьетесь – это вылет приложения без объяснения причин. Причины будут объяснены в следующей статье , также будет предложено решение данной проблемы.
В конструкторе класса мы вновь решили использовать свой собственный класс – apWebBrowser.
На данном этапе данный класс еще не существует, поэтому попытка сборки проекта ни к чему не приведет. Далее мы рассмотрим этот класс внимательнее, т.к. именно он будет содержать всю функциональность.
Как уже говорилось выше, проект C# может состоять из нескольких файлов. Это упрощает структуру проекта. Сейчас мы создадим отдельный файл для класса apWebBrowser.
Щелкните Project > Add Class (если такого пункта нет – выберите Project > Add Component), оба открывают одно и тоже окно – Add New Item. Разница лишь в том, что в первом случае уже выбран шаблон Class, а во втором случае шаблон нужно выбрать самостоятельно:
В поле Templates выберите шаблон Class, в поле Name введите имя файла – apWebBrowser (имя файла может не совпадать с названием класса, тем более в одном файле может быть несколько классов). Щелкните кнопку Add, чтобы создать новый файл.
Добавьте новый класс apWebBrowser на базе класса WebBrowser (отображает html-документы и выполняет переход между ними):
public class apWebBrowser : WebBrowser { private Uri ap_uri = new Uri("http://apanko.ru/apanko_last5.php"); public apWebBrowser() { this.Navigate(ap_uri); } }
Примечание. Не забудьте добавить using директиву для System.Windows.Forms.
В классе содержится закрытое свойство ap_uri типа Uri (Uniform Resource Identifier - унифицированный (единообразный) идентификатор ресурса).
Также в классе переопределен конструктор. В нем вызывается метод Navigate для перехода на страницу, указанную в поле ap_uri.
Теперь подпишем сборку. Для этого нужно открыть свойства проекта (щелкните Project > NAV4U.WebAddin Property).
В окне свойств проекта перейдите на закладку Signing и установите флаг в поле Sign the assembly.
После установки флага в поле Sign the assembly станет доступно поле Chose a strong name key file. Выберите в данном поле значение <New>
Откроется окно Create Strong Name Key. В данном окне введите значение NAV4U.WebAddin в поле Key file name, уберите флаг из поля Protect my key file with a password. Щелкните кнопку OK, чтобы завершить создание нового ключа.
Закроем окно свойств и осуществим сборку проекта. Для этого в Visual Studio щелкните Build > Build NAV4U.WebAddin.
Поместите сборку в каталог “C:\Program Files\Microsoft Dynamics NAV\60\RoleTailored Client\Add-ins” (можно настроить автоматическое копирование см. в статье ССЫЛКА).
Теперь зарегистрируем подключаемый компонент в NAV 2009. Для этого нужно узнать Public Key Token (Маркер открытого ключа).
Запустите Visual Studio 2008 Command Prompt (Пуск > Microsoft Visual Studio 2008 > Visual Studio Tools > Visual Studio 2008 Command Prompt).
Введите в командную строку следующую команду:
sn –T “C:\Program Files\Microsoft Dynamics NAV\60\RoleTailored Client\Add-ins\NAV4U.WebAddin.dll”
В данном случае Public Key Token - cd9aee5d8d268360, однако для вашей библиотеки он будет другим.
Итак, мы знаем имя подключаемого компонента и его Public Key Token. Зарегистрируем компонент в Microsoft Dynamics NAV 2009. Для этого в классическом клиенте Dynamics NAV 2009 нужно:
- Щелкнуть Tools > Object Designer, откроется окно Object Designer.
- Нажать кнопку Table, чтобы отобразить список таблиц.
- Найти таблицу 2000000069 Client Add-in и щелкнуть кнопку Run
- Создать новую запись со следующими полями:
- Control Add-in Name = NAV4U.WebAddin
- Public Key Token = cd9aee5d8d268360
Теперь встроим компонент в страницу, на этот раз это будет веб часть, входящая в состав ролевого центра. Для начала создадим веб часть, для этого в классическом клиенте Dynamics NAV 2009 нужно:
- Щелкнуть Tools > Object Designer, откроется окно Object Designer.
- Нажать кнопку Page, чтобы отобразить список страниц.
- Щелкнуть кнопку New, чтобы открыть окно New Page. Выберите режим Create blank page.
- Откройте окно Properties (View > Properties), в свойстве PageType укажите значение CardPart. Закройте окно Properties.
- Щелкните View > C/AL Globals, создайте переменную aplink типа text30.
- В окне Page Designer введите элемент с параметрами: Type = Container, SubType = ContentArea.
- В окне Page Designer введите второй элемент, подичненный первому, с параметрами: Type = Field, SourceExpr = aplink.
- Установите курсор на второй строке и щелкните View > Properties, в свойстве ControlAddIn выберите созданный ранее подключаемый компонент.
- Сохраните страницу Id = 50006, Caption = NAV4U.WebAddin.
Теперь подключим созданную страницу как FactBox в ролевой центр. Так как в демонстрационной версии по умолчанию используется ролевой центр менеджера по продажам, то FactBox будем встраивать в него.
- В классическом клиенте Dynamics NAV 2009 щелкните Tools > Object Designer, откроется окно Object Designer.
- Нажать кнопку Page, чтобы отобразить список страниц.
- Найти страницу 9006 Order Processor Role Center и щелкнуть кнопку Edit.
- В Page Designer перейти на пустую строку.
- Добавить новый элемент с параметром Type = Part. Этот элемент подчинен элементу <Control1900724708>
типа Group. - Щелкнуть View > Properties, установите в свойстве PagePartID значение NAV4U.WebAddin.
Запустите ролеориентированный клиент Microsoft Dynamics NAV 2009.
Вот такой маленький Internet Explorer прямо внутри ролевого центра. Можно даже щелкнуть по ссылке.
В следующей статье мы расширим функциональность подключаемого компонента таким образом, чтобы он еще больше проник в ролеориентированный клиент NAV 2009.
Благодарности.
Автор выражает признательность своему коллеге, Проценко Сергею, за помощь в написании статьи.
Метки: Андрей Панько







16 Октябрь 2009 в 8:56
Кстати аналогичную задачу (но через RSS) решали тут: http://techblog.byllemos.com/2009/10/rss-reader-add-in/, http://techblog.byllemos.com/2009/10/using-the-rss-reader-add-in/
Также в стандартную поставку входит аддин - RSS reader, который читает темы с https://community.dynamics.com/. Для дальнейшей информации см. объект Page 9175. Отдельно я бы обратил внимание на передаваемые этим аддином данные.