В карточках конструктора решений есть свойство типа "Нумератор". Оно позволяет пользователю выделить номер. Но как решить задачу автоматического выделения номера, например, при открытии карточки?
В текущих версиях конструктора сделать это можно только программно, и задача не тривиальная. поэтому приведу готовый кусок кода.
Обработчик события 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
Читать дальше