如何为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
相关产品推荐
相关产品推荐

