今天在我自己写的一个WPF程序中执行sql语句查询Oracle数据库时,发生一个很奇怪的错误,对于我输入的列名,一直提示标识符错误。
我是先根据select *查出来的列名,然后执行上图中选中的语句,一直报错。去网上搜都是说与oracle的关键字冲突了,要加双引号。但是加了之后,仍然报一样的错误,没有效果。
实在想不出解决办法,于是我用Toad看了一下表结构,发现这里面的LEVELCODE、SYSTEMCODE等列,其列名实际上是LEVEL_CODE、SYSTEM_CODE,也就意味着问题在于列名错了。
然后我通过调试我的程序发现,查询出来的DataTable中列名是有下划线的,但是交给DataGrid控件显示时,所有列名中的第一个下划线都没了。经检查发现,是DataGrid把_及后面的第一个字符当快捷键处理了,按住ALT键时,能看到后面一个字符下面出现了下划线。
找到问题后,就开始解决问题。在网上搜了一下,都说要把ContentPresenter的RecognizesAccessKey设为false就好了,但实际试了网上找到的所有办法,都没有解决问题。最后,还是只能自己来想办法解决。
经过不断的尝试,终于发现了一个非常简单的解决办法,将如下代码加入到DataGrid的父级元素的Resources中,或者干脆放到App.xaml中即可。
<Style TargetType="DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
这是针对列表头的,行表头只需把TargetType换成DataGridRowHeader即可。
这个解决方法的原理就是将生成表头的模板替换掉,替换成TextBlock,TextBlock不像ContentPresenter那样会去识别什么快捷键。
最后,鄙视下微软,什么鬼设计。