пятница, 27 ноября 2015 г.

Простой AutoLoad LookUpEdit.

Возникла задача загружать в LookUpEdit значения постепенно, в зависимости от подстроки.
Простейшее решение было найдено на сайте самого DX. Решение прекрасно работает, но дело в том, что поиск в LookUpEdit не поддерживает contains и ищет с начала строки. В примере это решено дописыванием к началу строки искомой подстроки:

      private void GetAutoCompleteList(AutoCompleteListEventArgs e) {
          e.AutoCompleteList.Clear();
          for(int i = 0; i < 10; i++) {
              e.AutoCompleteList.Add(String.Format("{0}{1}", e.AutoSearchText, RandomString(5, true)));
          }
      }
Выглядит это некрасиво. Поэтому что бы не показывать лишние данные нужно внедрить contains.
Для этого переопределим DataAdapter. Пример на VB был найдет здесь и осталось только переписать его на C#.


Сам DataAdapter:

    public class MyLookUpListDataAdapter : LookUpListDataAdapter
    {
        public MyLookUpListDataAdapter(AutoCompleteLookUpEditRepositoryItem item) : base(item)
        {

        }

        public override string FilterField
        {
            get
            {
                if ((Item as AutoCompleteLookUpEditRepositoryItem).FilterField == string.Empty)
                {
                    return base.FilterField;
                }
                return (Item as AutoCompleteLookUpEditRepositoryItem).FilterField;
            }
        }

        protected override string CreateFilterExpression()
        {
            dynamic foo = FilterField;
            if (string.IsNullOrEmpty(FilterPrefix))
            {
                return string.Empty;
            }
            string likeClause = DevExpress.Data.Filtering.Helpers.LikeData.CreateStartsWithPattern(FilterPrefix);
            return new BinaryOperator(FilterField, "%" + likeClause + "%", BinaryOperatorType.Like).ToString();
        }
    }
Так нужно внести изменения в класс AutoCompleteLookUpEditRepositoryItem:
        public string FilterField { set; get; }

        protected override LookUpListDataAdapter CreateDataAdapter()
        {
            return new MyLookUpListDataAdapter(this);
        }

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

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