Поиск блогу

четверг, 30 июня 2011 г.

Как подключать сборки в конструкторе DocsVision

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

Находятся все сборки по пути Windows/assembly/GAC_MSIL

Каталог скрытый, поэтому для доступа к нему через эксплорер необходимо включить отображение скрытых файлов и папок в свойствах папки.

Каждая сборка лежит в отдельной папке, поэтому подключать их придется по одной.

Из-за особенностей Конструтора у вас не получится подключить сборки сразу из assembly, поэтому скопируйте сначала нужные сборки в отдельную папку и уже оттуда подключайте. Но лучше удалить из GAC_MSIL скрытый файл "Desktop.ini". После этого папки со сборками станут видны из конструктора и их не придется никуда копировать. Также одном из плюсов данного способа является тот факт, что при переносе решения на другую машину, вам не придется заново прописывать пути к сборкам.

Для подключения сборки кликните на "+" в нижней таблице "Используемые дополнительные сборки" в окне редактирования скриптов конструктора, выберите нужную сборку и добавьте ее в таблицу.

Получение данных выделенной строки из таблицы

Вывод выделенной строки оказался весьма нетривиальным заданием.

Данный фрагмент кода выведет в MessageBox содержимое выделенной строки в табличном контроле с названием "Журнал заявки".

LayoutHelper layoutHelper = new LayoutHelper(CardControl.LayoutControl, CardControl.BarManager, Session, CardData.Type.Id);
DocsVision.BackOffice.View.WinForms.LayoutItems.ICustomPropertyItem propertyItem = layoutHelper.GetCustomPropertyItem("Журнал заявки");
var refMapper = new CardPropertyDescriptionMapper(Session);
DocsVision.BackOffice.Model.CardProperties.Entities.CardPropertyTable cpt = null;
foreach (DocsVision.BackOffice.Model.Layouts.Entities.CardPropertyTableDescription refPropertyTableDesc in refMapper.FindTableProperties(CardData.Type.Id))
          {
              if (refPropertyTableDesc.Name == "Журнал заявки")
               {
                 var propertyMapper = new CardPropertyMapper(Session, CardData.Id, DomainObject.CustomPropertiesSectionId);
                   cpt = propertyMapper.FindTable(refPropertyTableDesc);
                   break;
               }
          }
System.Reflection.Assembly asm = System.Reflection.Assembly.Load("DocsVision.BackOffice.View, Version=4.5.0.0, Culture=neutral, PublicKeyToken=7148afe997f90519");
Type tableType = asm.GetType("DocsVision.BackOffice.View.WinForms.PropertyControls.TablePropertyControl");
var propInfo = tableType.GetProperty("GridView");
object ooo = propInfo.GetValue(propertyItem.Control, System.Reflection.BindingFlags.NonPublic, null, null, System.Globalization.CultureInfo.InvariantCulture);
DocsVision.BackOffice.View.WinForms.Controls.GridExView gridExView = ooo as DocsVision.BackOffice.View.WinForms.Controls.GridExView;
DevExpress.XtraGrid.Views.Grid.GridView gridView = gridExView as DevExpress.XtraGrid.Views.Grid.GridView;
object key = ((System.Data.DataRowView)gridView.GetFocusedRow()).Row[gridExView.KeyField];
          foreach (DocsVision.BackOffice.Model.CardProperties.Entities.CardPropertyTableRow row in cpt.Rows)
          {
              if (row.Key == (Guid)key)
              {
                  string message = "";                  
                  foreach (DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty cellProp in row.Cells)
                      {
                       object val = cellProp.Value;                          
                       message += val == null ? "null" : val.ToString();
                       message += " ";    
                      }
                      MessageBox.Show(message);
                      }
    
              }


Для работы скрипта нужно прописать в using:

using DocsVision.Platform.WinForms.DataSource;
using DocsVision.BackOffice.Model.CardProperties.DataAccess;


Возможно, что-то еще...

а также подключить сборки DevExpress. А именно
DevExpress.XtraLayout.9.2.dll
DevExpress.XtraGrid.9.2.dll
DevExpress.Data.9.2.dll
DevExpress.Utils.9.2.dll

Добавление новой строки в табличный контрол из скрипта

Оговорю сразу, что данный метод работает, если для табличного контрола создана отдельная секция в карточке, так как добавление происходит через добавление записи в секцию.

Рассмотрим на примере таблицы, содержащей 3 столбца: Дату, идентификатор сотрудника и некоторый текст.

в приведенном скрипте:
secComment - это идентификатор табличной секции(Guid);
comment - какая-то строка(string)

Скрипт записывает текущую дату, пользователя, который открыл карточку в данный момент и некоторый текст.

Guid g = Guid.NewGuid();
CardData.Sections[secComment].BeginUpdate();
RowData newComment = CardData.Sections[secComment].CreateRow(g);
newComment.SetString("Текст", comment);
newComment.SetGuid("Автор", new EmployeeMapper(Session).GetCurrentUserId());
newComment.SetDateTime("Дата", DateTime.Now);
CardData.Sections[secComment].EndUpdate();