You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF DevExpress GridControl列标题多余空格去除咨询

解决DevExpress GridControl自动给列标题加空格的问题

这个问题我之前也踩过坑——DevExpress的GridControl在自动生成列时,默认会把驼峰命名的属性(比如ProductType)拆分成带空格的标题(Product Type),而你设置ColumnChooserHeaderCaption没用是因为这个属性是给列选择器用的,不是表头的显示文本。下面给你几种靠谱的解决方案:

方案1:直接在AutoGeneratingColumn事件中设置表头

这是最直接的方法,在自动生成列的事件里,把列的Header直接赋值为属性名,跳过默认的拆分逻辑:

首先在XAML中绑定事件:

<dxg:GridControl 
    AutoGenerateColumns="AddNew" 
    AutoGeneratingColumn="GridControl_AutoGeneratingColumn"
    ItemsSource="{Binding YourProductCollection}">
    <!-- 其他配置 -->
</dxg:GridControl>

然后在后台代码里实现事件处理:

private void GridControl_AutoGeneratingColumn(object sender, DevExpress.Xpf.Grid.AutoGeneratingColumnEventArgs e)
{
    // 用原始属性名作为表头,不添加空格
    e.Column.Header = e.PropertyName;
    
    // 如果需要列选择器里也显示无空格的标题,再加上这句
    e.Column.ColumnChooserHeaderCaption = e.PropertyName;
}

方案2:全局禁用自动拆分(所有GridControl生效)

如果你希望整个应用里的GridControl都不自动拆分驼峰命名,可以通过全局样式替换默认的表头生成模板:

在App.xaml的资源里添加:

<Application.Resources>
    <Style TargetType="dxg:GridColumn">
        <Setter Property="HeaderGeneratorTemplate">
            <Setter.Value>
                <DataTemplate>
                    <!-- 直接绑定属性名,不做拆分处理 -->
                    <TextBlock Text="{Binding}" />
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Application.Resources>

这样所有自动生成的列都会直接用属性名作为表头,不用每个GridControl都写事件。

方案3:用DisplayAttribute自定义表头(更灵活)

如果有些属性需要自定义表头,有些保持原始名称,可以给实体类的属性加上DisplayAttribute,然后在事件里读取这个属性:

首先给实体类添加标注:

using System.ComponentModel.DataAnnotations;

public class Product
{
    // 强制显示为ProductType,不拆分
    [Display(Name = "ProductType")]
    public string ProductType { get; set; }

    // 这里也可以自定义成其他文本,比如"商品分类"
    [Display(Name = "ProductCategory")]
    public string ProductCategory { get; set; }
    
    // 其他属性...
}

然后修改事件处理代码:

private void GridControl_AutoGeneratingColumn(object sender, DevExpress.Xpf.Grid.AutoGeneratingColumnEventArgs e)
{
    var displayAttribute = e.PropertyDescriptor.Attributes
        .OfType<DisplayAttribute>()
        .FirstOrDefault();
    
    if (displayAttribute != null && !string.IsNullOrEmpty(displayAttribute.Name))
    {
        e.Column.Header = displayAttribute.Name;
    }
    else
    {
        // 没有标注的属性,用原始名称
        e.Column.Header = e.PropertyName;
    }
}

关键提醒

之前你用ColumnChooserHeaderCaption无效的原因是:这个属性控制的是在列选择器(Column Chooser)中显示的标题,而不是网格表头的文本。网格表头对应的是Column.Header属性,所以一定要设置这个才会生效。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:12:05