Делегат изменения контрола фильтрации

В Flexberry ASP.NET существует делегат изменения контрола фильтрации (на настоящий момент изменение доступно для DatePicker) в WebObjectListView.

Как работает делегат: модуль фильтрации создаёт контролы для фильтрации посредством WebControlProvider, где вызывается делегат.

namespace ICSSoft.STORMNET.Web.Tools
{
    public class WebControlProvider
    {
        /// <summary>
        /// Делегат, позволяющий донастраивать контрол после его создания.
        /// </summary>
        public TuneControlDelegate TuneControlDelegateMethod;
		
		...
    }
}

CreatedControlData

CreatedControlData - это особая структура, сообщающая в делегат, откуда и для чего был создан контрол:

namespace ICSSoft.STORMNET.Web.Tools
{
    public class CreatedControlData
    {
		...
        /// <summary>
        /// Список вариантов причин создания контролов.
        /// </summary>
        public enum CreateControlReason
        {
            /// <summary>
            /// Это контрол для фильтрации в WebObjectListView.
            /// </summary>
            Filter
        }

        /// <summary>
        /// Причина создания контрола.
        /// </summary>
        public CreateControlReason ControlCreationReason { get; private set; }

        /// <summary>
        /// Тип свойства, для работы с которым создавался контрол.
        /// </summary>
        public Type PropertyType { get; private set; }

        /// <summary>
        /// Имя свойства, для работы с которым создаётся контрол.
        /// </summary>
        public string PropertyName { get; private set; }

        /// <summary>
        /// Тип, в котором находится свойство, для работы с которым создаётся контрол.
        /// </summary>
        public Type DataObjectType { get; private set; }
    }
}

Пример

Делегат можно определить следующим образом:

/// <summary>
/// Обработчик события завершения инициализации.
/// </summary>
/// <param name="e">Параметры события.</param>
protected override void OnInitComplete(EventArgs e)
{
	base.OnInitComplete(e);
	WebObjectListView1.WebControlProvider.TuneControlDelegateMethod = ChangeControlDelegateMethod;
}

/// <summary>
/// Делегат, который поменяет настройки одного из контролов для отображения дат в строке фильтрации.
/// </summary>
/// <param name="control">Сам контрол.</param>
/// <param name="changeControlDelegateData">Параметры создания контрола (для чего был создан).</param>  
private void ChangeControlDelegateMethod(Control control, CreatedControlData changeControlDelegateData)  
{  
	if (control is DatePicker  
  	    && changeControlDelegateData.ControlCreationReason  
            == CreatedControlData.CreateControlReason.Filter  
            && changeControlDelegateData.DataObjectType == typeof(TestChangeControlDelegate)  
            && changeControlDelegateData.PropertyName  
            == Information.ExtractPropertyPath<TestChangeControlDelegate>(x => x.DateTimePropertyWithDelegate))  
        {  
        	var datePicker = (DatePicker)control;  
        	datePicker.OnlyDate = false;  
        	datePicker.DateFormat = "По этому полю нельзя отфильтровать.";  
        	datePicker.TimeFormat = string.Empty;  
        }  
}  

При этом в контроле фильтрации, соответствующем свойству DateTimePropertyWithDelegate будет доступно задание даты и в фильтре будет отображаться надпись “По этому полю нельзя отфильтровать”.