Пример реализации командного расширения Windows-клиента
В проекте создаётся расширения Windows-клиента, которое добавляет на ленту инструментов новую команду, организующую перевод курсора на личную папку текущего сотрудника. Личная папка должна быть задана в Справочнике сотрудников.
-
Создать проект (Microsoft Visual Studio) типа "Class Library".
-
Создайте элемент управления "User Control" (Windows Forms).
-
Измените базовый класс элемента управления с UserControl на
NavExtension
. -
Переопределить необходимые методы и свойства базового класса (см. пример).
-
Создать библиотеку карточек (доступна в архиве проекта), включив в неё карточку, использующую созданный компонент.
-
Зарегистрировать реализованный компонент в GAC (предпочтительно) на всех клиентских машинах.
-
Зарегистрировать с использованием программы CardManager, входящей в Resource Kit, созданную библиотеку карточек на сервере Docsvision.
using DocsVision.Platform.Extensibility;
using DocsVision.Platform.ObjectManager;
using DocsVision.Platform.ObjectManager.Metadata;
using DocsVision.Platform.ObjectManager.SearchModel;
using DocsVision.Platform.WinForms;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace DocsVision.Test.NavPluging
{
[ComVisible(true)]
[Guid("6A0676EE-1DAF-4A59-B5EB-E0B5B4C175E1")]
[ClassInterface(ClassInterfaceType.None)]
public partial class Plugin : NavExtension
{
public Plugin() { }
protected override NavExtensionTypes SupportedTypes (1)
{
get
{
return NavExtensionTypes.Command;
}
}
protected override string GetExtensionName(NavExtensionTypes extensionType) (2)
{
return "Быстрый выбор";
}
protected override IEnumerable<NavCommand> CreateCommands() (3)
{
NavCommand myCommand = new NavCommand();
myCommand.CommandType = NavCommandTypes.ToolBar; <.> // В данном случае -- команда размещается на ленте инструментов
myCommand.Name = "Выбрать папку";
myCommand.Description = "Команда выбирает заданную папку";
myCommand.Location = new NavCommandLocation()
{
RibbonTabLocations = new RibbonTabLocation[] (4)
{
new RibbonTabLocation
{
Tab = "Доп. команды",
Groups = new string[] { "Группы" }
}
}
};
return new List<NavCommand> { myCommand };
}
protected override NavCommandStatus QueryCommandStatus(NavCommand command, NavCommandContext context) (5)
{
return NavCommandStatus.Enabled | NavCommandStatus.Supported; (6)
}
protected override void InvokeCommand(NavCommand command, NavCommandContext context) (7)
{
string accountName = base.Session.Properties["AccountName"].Value.ToString();
Guid Employees = new Guid("DBC8AE9D-C1D2-4D5E-978B-339D22B32482"); (8)
SectionQuery sectionQuery = base.Session.CreateSectionQuery();
sectionQuery.ConditionGroup.Conditions.AddNew("AccountName", FieldType.String, ConditionOperation.Equals, accountName); (9)
CardData staffData = base.Session.CardManager.GetDictionaryData(RefStaff, false);
RowDataCollection users = staffData.Sections[Employees].FindRows(sectionQuery.GetXml());
if (users.Count > 0)
{
Guid? personalFolderID = users[0].GetGuid("PersonalFolder"); (10)
if (personalFolderID.HasValue)
{
CardFrame.CardHost.ActivateFolder(personalFolderID.Value, true); (11)
}
}
}
}
}
1 | Тип расширения. |
2 | Название расширения. |
3 | Инициализация списка команд. |
4 | Создание вкладки на панели инструментов, для помещения в ней новой команды. |
5 | Проверка команды на доступность. |
6 | Команда всегда доступна. |
7 | Непосредственное исполнение команды расширения. |
8 | Идентификаторы Справочника сотрудников и секции Сотрудники
Guid RefStaff = new Guid("6710B92A-E148-4363-8A6F-1AA0EB18936C") . |
9 | Поиск в секции Сотрудники сотрудника с учетной записью accountName (учетная запись текущего сотрудника). |
10 | Получение личной папки. |
11 | Установка курсора на папку. |
В реализуемых методах, проверка параметра command
не выполняется, однако в реальных проектах это может понадобиться.
Готовая сборка должна иметь строгое имя, см. Создание и использование сборок со строгими именами. |
Полностью проект, содержащий командное расширение и библиотеку карточек, доступен по ссылке. |