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

如何通过DataColumn.Caption设置WPF DataGrid自动生成列的Header

方案1:通过列名匹配DataTable(优先推荐,无兼容性风险)

你完全不需要访问内部的DataColumnPropertyDescriptor,DataGridAutoGeneratingColumnEventArgs的PropertyName属性就直接对应DataColumn.ColumnName,只要你持有绑定的DataTable实例,直接通过列名查找即可:

// 首先在你的UserControl中保存绑定的DataTable引用,示例命名为_boundDataTable
private void dgProviderValues_AutoGeneratedColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (_boundDataTable.Columns.Contains(e.PropertyName))
    {
        DataColumn targetCol = _boundDataTable.Columns[e.PropertyName];
        // 替换列头为自定义Caption
        e.Column.Header = targetCol.Caption;
        
        // 隐藏列逻辑示例:不需要生成的列直接设置e.Cancel = true
        if (targetCol.ColumnName == "内部字段名" || string.IsNullOrEmpty(targetCol.Caption))
        {
            e.Cancel = true;
        }
    }
}

该方案不依赖任何内部实现,性能和兼容性都最佳,是首选方案。

方案2:反射读取内部属性(仅适用于无法获取DataTable实例的场景)

如果你的场景无法拿到绑定的DataTable引用,可以通过反射读取PropertyDescriptor的内部Column属性:

using System.Reflection;

private void dgProviderValues_AutoGeneratedColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    PropertyDescriptor pd = e.PropertyDescriptor;
    if (pd == null) return;
    
    // 反射获取内部Column属性
    PropertyInfo colProp = pd.GetType().GetProperty("Column", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    if (colProp != null && colProp.PropertyType == typeof(DataColumn))
    {
        DataColumn targetCol = (DataColumn)colProp.GetValue(pd);
        e.Column.Header = targetCol.Caption;
        
        // 隐藏列逻辑同上
    }
}

注意该方案依赖.NET内部类的实现细节,后续.NET版本更新如果修改了DataColumnPropertyDescriptor的实现,可能会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:27:03