【问题标题】:Unable to have a dash (-) in the name of a datatable column for filtering无法在数据表列的名称中包含短划线 (-) 以进行过滤
【发布时间】:2017-05-02 13:29:26
【问题描述】:

我遇到了过滤数据表的问题。一列称为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

将不胜感激每一个建议。

【问题讨论】:

  • 转义字符([])可能取决于数据库类型。
  • @UweKeim:它与数据库无关,因为 DataTable 是内存中的集合。文档在这里(备注部分):msdn.microsoft.com/en-us/library/…
  • dv.Table.Columns.Contains("BANF-Nummer") 返回什么?我怀疑false
  • 不,Uwe,那也不行……谢谢。
  • 您的屏幕截图显示为AND ([BANF-Nummer]) > '-1',而您的问题显示为AND [BANF-Nummer] > '-1'。 (注意方括号周围的())。

标签: c# datatable dataview rowfilter


【解决方案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();

【讨论】:

  • OP 说这不起作用。可能这不是 Sql Server。
  • @juharr: 这根本不是 sql :)
  • 我发现了问题。列名 - 为什么会 - 部分以 Unicode 字符显示。我的专栏名为 BANF-Nummer,但列为 BANF_x002d_Nummer_x0020__x0028_A。 002d是'-',0020是空白,0028是'('(为什么)和_A。所以,里面有一点系统。我现在不能更改源表,我必须与它协商发起人。我认为,在源表中,当前单元格没有被格式化为“文本”。
  • 来源是一个共享点列表(基于 Excel 工作表)。我把所有的内容都放到了一个数据表中,因为我正在编写的这个程序仍然实现了数据表(来自 BluePrism 的 RPA)。
  • Tim 似乎对这个数据视图或数据表的东西和行过滤功能很熟悉。是否有可能过滤列中的所有数字?像 string FilterExpression = "Column = 'Any Number'" 但功能齐全。
【解决方案2】:

好的,我想通了,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

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

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2012-07-24
    • 1970-01-01
    • 2018-12-20
    • 2013-04-09
    相关资源
    最近更新 更多