среда, 22 декабря 2010 г.

Програмное выделение номера в карточках конструктора решений

В карточках конструктора решений есть свойство типа "Нумератор". Оно позволяет пользователю выделить номер. Но как решить задачу автоматического выделения номера, например, при открытии карточки?

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


Обработчик события AfterActivate - будет выполнен сразу после открытия карточки.

на С#
// обработчик события AfterActivate - будет выполнен сразу после открытия карточки
private void cardControl_AfterActivate(System.Object sender, System.EventArgs e)
{
// получаем свойство типа "Нумератор". Нужно указать название свойства
var numeratorProperty = GetCardProperty("Регистрационный номер");
// если номер уже задан, то выходим из метода, ничего не делая
if (numeratorProperty.Value != null)
return;
// получаем атрибут правила и его значение (идентификатор)
var ruleAttribute = numeratorProperty.Description.GetAttribute("Rule");
Guid? ruleId = (Guid?)ruleAttribute.Value;
// с помощью преобразователя данных создаем новый номер по правилу
var numeratorMapper = new DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(
Session, CardData.Id, DomainObject.NumbersSectionId.Value);
var number = numeratorMapper.Create(ruleId.Value);
// устанавливаем новое значение свойства
numeratorProperty.Value = number;
// обновляем элементы карточки, чтобы отобразить новое значение
RefreshControls();
}

// вспомогательный метод поиска элемента по названию
private CardProperty GetCardProperty(string propertyName)
{
foreach (CardProperty property in PropertyController.CardProperties)
{
if (property.Name == propertyName)
return property;
}
return null;
}

Vb.net

Private Sub cardControl_AfterActivate(sender As System.Object, e As System.EventArgs)
 
  ' получаем свойство типа "Нумератор"
  Dim numeratorProperty AS DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty  = GetCardProperty("Регистрационный номер")
  ' если номер уже задан, то выходим из метода, ничего не делая

  If numeratorProperty.Value IsNot Nothing Then
   Return
  End If
  ' получаем атрибут правила и его значение (идентификатор)
  Dim ruleAttribute as DocsVision.BackOffice.Model.Layouts.Entities.PropertyAttribute = numeratorProperty.Description.GetAttribute("Rule")
  
  Dim ruleId As System.Nullable(Of Guid) = CType(ruleAttribute.Value, System.Nullable(Of Guid))
  ' с помощью преобразователя данных создаем новый номер по правилу
  Dim numeratorMapper as DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper  = New DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(me.Session, CardData.Id, DomainObject.NumbersSectionId.Value)
  Dim number as DocsVision.BackOffice.Model.CardProperties.Entities.NumeratorNumber  = numeratorMapper.Create(ruleId.Value)
  ' устанавливаем новое значение свойства
  numeratorProperty.Value = number
  ' обновляем элементы карточки, чтобы отобразить новое значение

  me.PropertyController.RefreshControls
  
    End Sub


 ' вспомогательный метод поиска элемента по названию
 Private Function GetCardProperty(propertyName As String) As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty 
  For Each [property] As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty In PropertyController.CardProperties
   If [property].Name = propertyName Then
    Return [property]
   End If
  Next
  Return Nothing
 End Function

Комментариев нет:

Отправить комментарий