无法在数据表列的名称中使用短划线( - )进行过滤

时间:2017-05-02 13:29:27

标签: c# datatable dataview rowfilter

我遇到了过滤数据表的问题。一列是calles BANF-Nummer 。使用过滤器,我收到一条错误消息。我为此写了以下代码:

FilterExpression = "(Kontierungsobjekt = 'Kostenstelle' OR Kontierungsobjekt = 'Co-Auftrag') AND BANF-Nummer > '-1'";
dv.RowFilter = FilterExpression; //ERROR!

错误消息是:

  

找不到列[Nummer]

下面还有另一篇关于类似问题的帖子: Unable to Have (-) Dash in DataView Filter C#

此修复程序无法解决我的问题。如果我试试这个:

FilterExpression = "(Kontierungsobjekt = 'Kostenstelle' OR Kontierungsobjekt = 'Co-Auftrag') AND [BANF-Nummer] > '-1'";

dv.RowFilter = FilterExpression; //错误!

错误信息是:

  

找不到列[BANF-Nummer]

如果我用另一列测试此功能,例如 Kostenstelle ,它可以完美地工作。所以错误在名称​​ BANF-Nummer 中是明确的,我无法改变。

这是我的问题的截图: enter image description here

对每一条建议都表示感谢。

2 个答案:

答案 0 :(得分:1)

你必须用方括号括起来:

FilterExpression = "(Kontierungsobjekt = 'Kostenstelle' OR Kontierungsobjekt = 'Co-Auftrag') AND [BANF-Nummer] > '-1'";

在文档here

中提到过

既然你已经尝试过但它仍然无效:

dv.Table.Columns.Contains("BANF-Nummer")返回什么?我怀疑false

  

你是对的Tim,它返回false

然后该表不包含此列,也许用于填充此表的sql-query使用了别名或者您输入了拼写错误。

使用以下LINQ查询查找您的列(您的表包含104列作为评论):

List<DataColumn> candidates = dv.Table.Columns.Cast<DataColumn>()
   .Where(c=> c.Colum‌​nName.StartsWith("BA‌​NF", StringComparison.OrdinalIgnoreCase))
   .ToList();

答案 1 :(得分:0)

好的,我发现,sharepoint中的名称内部存储在unicode中。 https://social.msdn.microsoft.com/Forums/sharepoint/en-US/ea47e82b-273e-48bc-a6cb-c961e2c7c06a/how-to-set-and-get-item-if-the-sharepoint-column-name-has-space?forum=sharepointdevelopmentprevious

我可以这样转换它:

string Key = Field.Key; //Co_x002D_Auftrag
Key = System.Xml.XmlConvert.DecodeName(Key); //Co-Auftrag
Key = System.Xml.XmlConvert.EncodeName(System.Xml.XmlConvert.DecodeName(Key)); //Co_x002D_Auftrag

现在我必须弄清楚,如果 - 以及如何 - 我可以将它用于我的过滤功能。