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

时间:2015-11-18 12:12:22

标签: c# winforms devexpress filtering gridcontrol

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

例如,像1,2,5,11,22,37这样的数据集,过滤器列表的排序方式类似于1,11,2,22,5,37(就像字符串一样),当我们选择其中一个可用值时过滤不起作用(我的意思是,网格为空)。甚至像“非空单元格”这样的过滤器也不起作用,但是当我们选择“空单元格”时,即使大多数单元格没有值,也只显示几千行中的少数几个。

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

数据源是一个容器(类似于List。)

我们正在使用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

不幸的是,它没有说什么和哪里(除了一些'lambda表达式')异常被抛出。

当然column是上面提到的列。

@edit 我找到了新的“小费”。 FilterItem对象肯定包含字符串,但它们应包含长值。我们怎样才能影响这些创建或至少在哪里检查为什么那些被创建(我们不手动)?

@Edit 19.11.2015 好吧,我有一些突破。列('custom')由于我们的机制猜测它们的类型很好。那么唯一的问题是,我们自定义列使用的值存储在Dictionary<string,object> - 就像集合一样,我们认为感谢PropertyDescriptor列的类型很好,但由于某种原因FilterItem个对象有Value的字符串。我们相信这是因为DX过滤机制无法真正猜出“对象”的类型,因此它使用简单的ToString,因此FilterItem.Value是字符串类型而不是列的数据类型。

如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

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