我们在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
是字符串类型而不是列的数据类型。
如何克服这个问题?
答案 0 :(得分:0)
我们找到了解决方案,错误就在我们这边。列创建等很好。某个地方很深,有人改变了价值类型。