欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决WPF中DataGrid的列表头不显示下划线的问题

程序员文章站 2022-06-01 09:11:58
...

今天在我自己写的一个WPF程序中执行sql语句查询Oracle数据库时,发生一个很奇怪的错误,对于我输入的列名,一直提示标识符错误。

解决WPF中DataGrid的列表头不显示下划线的问题

我是先根据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那样会去识别什么快捷键。

最后,鄙视下微软,什么鬼设计。