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

如何为Telerik UI for Blazor Grid实现泛型列宽计算方法?

泛型实现Telerik UI for Blazor Grid动态列宽计算

需求说明

需要创建一个泛型方法,接收LINQ查询返回的数据,计算指定列的最长字符串长度,乘以设定值后与最小宽度比较,最终返回带px的宽度字符串,用于Telerik Blazor Grid的列宽设置,且方法支持任意实体类型,而非特定实体。

原非泛型实现代码

@using System.Linq.Expressions
@using LinqKit

public string GetColumnWidth(int MinTitleWidth, Expression<Func<MyEntityModel, string>> selector, DataSourceResult dataSourceResult)
{
    int MinColumnTitleWidthCheck = dataSourceResult.Data.Cast<MyEntityModel>()
        .Select(i => selector.Invoke(i))
        .ToList()
        .Aggregate("", (max, cur) => max.Length > cur.Length ? max : cur)
        .Length * 12;
    MinColumnTitleWidthCheck = MinColumnTitleWidthCheck > MinTitleWidth ? MinColumnTitleWidthCheck : MinTitleWidth;
    return MinColumnTitleWidthCheck.ToString() + "px";
}

泛型实现方案

将方法修改为泛型版本,适配任意实体类型,同时优化性能与异常处理:

@using System.Linq.Expressions
@using LinqKit
@using Telerik.DataSource

public string GetColumnWidth<T>(int minTitleWidth, Expression<Func<T, string>> selector, DataSourceResult dataSourceResult)
{
    // 将表达式编译为委托,提升调用性能
    var getStringValue = selector.Compile();
    
    // 提取指定列的所有字符串,计算最长长度(处理null值避免空引用)
    int maxContentLength = dataSourceResult.Data.Cast<T>()
        .Select(item => getStringValue(item) ?? string.Empty)
        .Aggregate(0, (maxLength, current) => Math.Max(maxLength, current.Length));
    
    // 计算最终宽度:内容宽度与最小标题宽度取最大值
    int calculatedWidth = maxContentLength * 12;
    int finalWidth = Math.Max(calculatedWidth, minTitleWidth);
    
    return $"{finalWidth}px";
}

关键改动说明

  • 泛型参数T:替换原有的MyEntityModel,使方法支持任意实体类型,调用时只需传入对应实体类型即可(示例:GetColumnWidth<YourEntity>(100, x => x.YourColumn, dataResult))。
  • 表达式编译优化:将Expression<Func<T, string>>编译为委托后调用,比直接使用selector.Invoke()性能更优,尤其在数据量较大时。
  • null值处理:添加?? string.Empty避免字段值为null时触发空引用异常,null值按空字符串计算长度(长度为0)。
  • 简化长度计算:直接用Math.Max在Aggregate中计算最长长度,比先找最长字符串再取长度的逻辑更高效。

使用示例

在Telerik Grid列配置中调用该方法:

<TelerikGrid Data="@GridData" Pageable="true">
    <GridColumns>
        <GridColumn Field="@nameof(Product.Name)" 
                    Width="@GetColumnWidth<Product>(120, x => x.Name, GridDataSourceResult)" />
        <GridColumn Field="@nameof(Product.Description)" 
                    Width="@GetColumnWidth<Product>(150, x => x.Description, GridDataSourceResult)" />
    </GridColumns>
</TelerikGrid>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:35:17