У нас возникла проблема с фильтрацией для некоторых наших столбцов в децентрализованном управлении devexpress. Мы динамически добавляем столбец (столбец граничного типа) в сетку. Значения из исходных объектов: long
. В ячейках кажется, что значения прекрасны (поскольку они выравниваются вправо без каких-либо настраиваемых форм на нашей стороне), однако в значениях всплывающих окон фильтра действуют как строки.Столбец сетки содержит значения int64, но фильтр показывает строки и не работает/
Например, набор данных, подобный 1,2,5,11,22,37, список фильтров сортируется как 1,11,2,22,5,37 (точно так же, как строки), и когда мы выбираем один из доступных значения фильтрация не работает (я имею в виду, сетка становится пустой). Даже фильтры, такие как «Не пустые ячейки», не работают, но когда мы выбираем «пустые ячейки», показываются лишь немногие из нескольких тысяч строк, даже если большинство ячеек не имеют значений.
Важно отметить, что только динамически добавленные столбцы ведут себя таким образом, несколько столбцов, которые мы создаем каждый раз, когда наш модуль работает, как и предполагалось.
Источник данных - это контейнер (список как).
Мы используем DevExpress 13.2.
Пример создания «пользовательский столбец»
void CreateColumn(GridColumn gridColumn, string fieldName = null, string caption = null, bool visible = true,
bool readOnly = true, UnboundColumnType unboundType = UnboundColumnType.Bound,
int columnWidth = int.MinValue, int minColumnWidth = int.MinValue)
{
gridColumn.Caption = caption;
if (fieldName != null)
gridColumn.FieldName = fieldName;
gridColumn.Visible = visible;
gridColumn.OptionsColumn.ReadOnly = readOnly;
gridColumn.OptionsColumn.AllowEdit = !readOnly;
gridColumn.UnboundType = unboundType;
gridColumn.OptionsFilter.AllowAutoFilter = true;
gridColumn.FilterMode = ColumnFilterMode.Value;
gridColumn.OptionsFilter.AutoFilterCondition = DevExpress.XtraGrid.Columns.AutoFilterCondition.Contains;
if (columnWidth != int.MinValue)
{
gridColumn.Width = columnWidth;
gridColumn.OptionsColumn.FixedWidth = true;
}
if (minColumnWidth != int.MinValue)
gridColumn.MinWidth = minColumnWidth;
}
GridColumn gridColumn = new GridColumn();
CreateColumn(gridColumn, "someName", "someCaption", true, true);
View.Columns.Add(newGridColumn);
Вот как это происходит в нашем коде (полосатые большинство не связанного кода просто дать пример процесса).
@edit Там недействительно и исключение литая, когда мы добавим фильтр, как это:
ColumnFilterInfo filter = GetFilter(); //cant really post code of this
ourGrid.MainView.ActiveFilter.Add(column, filter); // VS points here
К сожалению, это не говорит, что и где (за исключением некоторых «лямбда-выражения») исключения бросают.
Конечно, column
- упомянутая выше колонка.
@edit Я нашел новый «наконечник». Объекты FilterItem содержат строки точно, однако они должны содержать длинные значения. Как мы можем влиять на создание этих или по крайней мере там, где можно проверить, почему они созданы так (мы не делаем это вручную)?
@Edit 19.11.2015 Хорошо, у меня был какой-то прорыв. Столбцы («custom») благодаря нашему механизму догадываются о их типе просто отлично. Тогда только проблема заключается в том, что infact наши значения, которые используют пользовательские столбцы, хранятся в коллекции Dictionary<string,object>
, и мы считаем, что благодаря PropertyDescriptor
тип для столбцов в порядке, но по какой-то причине FilterItem
объектов имеют Value
строки. Мы верим в то, что механизм фильтрации DX не может действительно угадать тип «объекта», поэтому он использует простую ToString на нем, поэтому FilterItem.Value
является строковым типом, а не типом данных столбца.
Как преодолеть это?
Какую версию вы используете? –
@IvanStoev Извините, обновил мой вопрос - 13.2 – user2475983
Кажется, работает в последней версии (15.1). Не могли бы вы разместить образец кода, который динамически добавляет столбец. –