网格列包含 int64 值,但过滤器显示字符串并且不起作用/

Grid column contains int64 values but filter shows strings and doesn't work/

我们在过滤 devexpress gridcontrol 中的某些列时遇到问题。我们动态地将列(绑定类型的列)添加到网格中。来自源对象的值是 long 类型。在单元格中,值似乎很好(因为它们右对齐,我们这边没有任何自定义格式)但是在过滤器弹出窗口中,值表现得像字符串。

例如像 1,2,5,11,22,37 这样的数据集,过滤器列表按 1,11,2,22,5,37(就像字符串)排序,当我们选择其中一个时过滤不起作用的可用值(我的意思是,网格变成空的)。即使像 "Non empty cells" 这样的过滤器也不起作用,但是当我们选择 "empty cells" 时,即使大多数单元格都没有值,也只会显示几千行中的几行。

重要的是要指出,只有动态添加的列才会这样,每次我们的模块运行时我们创建的少数列都按预期工作。

数据源是容器(List like)。

我们正在使用 DevExpress 13.2。

创建示例 'custom column'

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);

这就是我们代码中的方式(剥离了大部分不相关的代码只是为了给出示例过程)。

@编辑 当我们像这样添加过滤器时会出现无效的转换异常:

ColumnFilterInfo filter = GetFilter(); //cant really post code of this
ourGrid.MainView.ActiveFilter.Add(column, filter); // VS points here

不幸的是,它没有说明抛出异常的原因和位置(某些 'lambda expression' 除外)。

当然是column就是上面说的那个栏目

@编辑 我发现了新的 "tip"。 FilterItem 对象肯定包含字符串,但它们应该包含长值。我们如何影响这些的创建,或者至少在哪里检查为什么会这样创建(我们不手动创建)?


@编辑 2015 年 11 月 19 日 好吧,我有了一些突破。由于我们的机制,列 ('custom') 猜测它们的类型就好了。那么唯一的问题是,实际上我们的自定义列使用的值存储在类似 Dictionary<string,object> 的集合中,我们认为由于 PropertyDescriptor 列的类型很好,但由于某些原因 FilterItem 对象有 Value 个字符串。我们认为这是因为 DX 过滤器机制无法真正猜测 "object" 的类型,所以它使用简单的 ToString 就可以了,所以 FilterItem.Value 是字符串类型而不是列的数据类型。

如何克服这个问题?

我们找到了解决方案,错误在我们这边。列创建等很好。在某个深处,有人更改了值类型。