ICSSoft.STORMNET.Web.AjaxControls.DecimalTextBox - это web-контрол, представляющий собой TextBox, на который наложен фильтр ввода для валидации положительных вещественных чисел в форме десятичной дроби. Работа с ним аналогична работе с обычным TextBox’ом, так как это его наследник. Для разделения целой и дробной части используется точка или запятая.
DecimalTextBox
генерируется на web-форме редактирования, если у свойства объекта выставлен тип Double, Decimal или Single, а так же Nullable-аналоги этих типов. Для этих типов на списковой форме и web-форме редактирования удаляются незначащие нули.
При вставке из буфера значений, которые не являются положительными вещественными числами, в контроле отображается “0”.
Свойства
Наименование | Тип | Описание |
---|---|---|
MaxDecimalPlaces | Int | Максимальное число знаков после десятичного разделителя. Если значение отрицательное, то ограничение на количество знаков после запятой не накладывается. |
Особенности использования
Когда компонент DecimalTextBox
используется для отображения вещественных чисел, для которых в базе данных используется тип с фиксированным количеством знаков после запятой (в том числе с 0 знаками после запятой), необходимо устанавливать свойство MaxDecimalPlaces для корректного отображения числа в компоненте.
На данный момент DataObject не хранит метаданные о количестве знаков после запятой для вещественных типов C#, поэтому при генерации приложений нет возможности автоматизировать инициализацию свойства MaxDecimalPlaces.
Если не инициализировать свойство MaxDecimalPlaces
в указанном выше случае, то на форме редактирования после изменения свойств существующего объекта данных в компоненте DecimalTextBox
и последующего сохранения данных без закрытия формы, вещественное число может отображаться не корректно - отображаемое количество знаков после запятой может не соответствовать тому количеству знаков, которое указано для соответствующего типа в базе данных (отображаться будет то значение, которое ввел пользователь перед сохранением). При добавлении нового объекта данных такого поведения не наблюдается, поскольку выполняется дополнительный запрос к серверу для получения значения первичного ключа у нового объекта данных, в результате чего происходит повторное считывание объекта данных перед отображением на форме (при этом значения полей отображаются так, как они хранятся в базе данных).
Возможно, в будущих версиях Flexberry Designer появится возможность указывать и хранить количество знаков после запятой для вещественных типов C# на уровне метаданных, тогда необходимость в ручной установке свойства MaxDecimalPlaces отпадет.
DecimalTextBox в AjaxGroupEdit
По умолчанию для редактирования вещественных чисел в AjaxGroupEdit используется обычный TextBox. Чтобы редактирование проходило с помощью DecimalTextBox, требуется произвести соответствующие настройки через WebControlProvider.
Например, если требуется редактировать свойство Свойство5 класса SeveralViewsDetail с помощью контрола DecimalTextBox, то в WebControlProvider.xml нужна следующая запись:
<customproperty class="SeveralViewsDetail" property="Свойство5">
<editcontrol typename="ICSSoft.STORMNET.Web.AjaxControls.DecimalTextBox, ICSSoft.STORMNET.Web.AjaxControls" codefile="" property="Text"/>
</customproperty>
Чтобы в AjaxGroupEdit
изменить значения свойств DecimalTextBox
, можно воспользоваться делегатом.
Например, если свойство Свойство5
класса SeveralViewsDetail
редактируется в рамках представления SeveralViewsDetailD1 и требуется ограничить количество цифр после запятой тремя, то требуется определить соответствующий делегат:
ICSSoft.STORMNET.Web.AjaxControls.AjaxGroupEdit.SetControlTuner(SeveralViewsDetail.Views.SeveralViewsDetailD1.Name, TuneControlDelegate);
/// <summary>
/// Делегат для донастройки контрола в AGE.
/// В данном случае для свойства <see cref="SeveralViewsDetail.Свойство5"/>
/// для контрола <see cref="ICSSoft.STORMNET.Web.AjaxControls.DecimalTextBox"/>
/// выставляем максимальное количество символов после запятой "3".
/// </summary>
/// <param name="control">Текущий подобранный контрол.</param>
/// <param name="createdControlData">Параметры для контрола.</param>
private void TuneControlDelegate(Control control, CreatedControlData createdControlData)
{
string searchedProperty = ICSSoft.STORMNET.Information.ExtractPropertyPath<SeveralViewsDetail>(x => x.Свойство5);
if (createdControlData.ControlCreationReason == CreatedControlData.CreateControlReason.Edit
&& createdControlData.DataObjectType == typeof(SeveralViewsDetail)
&& createdControlData.PropertyName == searchedProperty)
{
if (!(control is ICSSoft.STORMNET.Web.AjaxControls.DecimalTextBox))
{
throw new System.Exception(
string.Format(
"Для корректного функционирования теста {0} требуется, чтобы для редактирования свойства {1} использовался контрол {2}.",
typeof(TestDecimalAge).Name,
searchedProperty,
typeof(ICSSoft.STORMNET.Web.AjaxControls.DecimalTextBox).Name));
}
var decimalTextBox = (ICSSoft.STORMNET.Web.AjaxControls.DecimalTextBox)control;
decimalTextBox.MaxDecimalPlaces = 3;
}
}