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

如何在同一布局的if语句下复用Radzen DataGrid并动态指定TItem?

复用Radzen DataGrid的可行方案

Radzen DataGrid的TItem是编译时确定的泛型参数,无法通过字符串动态指定,但可以通过以下几种方式实现单表格复用,避免重复编写代码:

1. 基于基类/接口统一类型

如果三个场景的数据类存在共同属性,定义一个基类或接口让它们继承/实现,将TItem指定为这个基类/接口,再通过切换Data绑定的数据源实现复用:

步骤1:定义通用接口/基类

// 定义包含所有表格需展示属性的接口
public interface IGridItem
{
    int Id { get; set; }
    string DisplayName { get; set; }
    DateTime CreateTime { get; set; }
}

// 三个场景的数据类实现该接口
public class Order : IGridItem { /* 实现接口属性 + 订单专属属性 */ }
public class User : IGridItem { /* 实现接口属性 + 用户专属属性 */ }
public class Product : IGridItem { /* 实现接口属性 + 商品专属属性 */ }

步骤2:页面中复用表格

<RadzenDataGrid @ref="gridRef" Data="@currentDataSource" TItem="IGridItem" AutoGenerateColumns="false">
    <Columns>
        <RadzenDataGridColumn Property="Id" Title="ID" />
        <RadzenDataGridColumn Property="DisplayName" Title="名称" />
        <RadzenDataGridColumn Property="CreateTime" Title="创建时间" FormatString="yyyy-MM-dd" />
        
        <!-- 根据当前场景显示专属列 -->
        @if (currentScenario == "Order")
        {
            <RadzenDataGridColumn Property="@nameof(Order.OrderNo)" Title="订单编号" />
        }
        @if (currentScenario == "User")
        {
            <RadzenDataGridColumn Property="@nameof(User.Email)" Title="邮箱" />
        }
    </Columns>
</RadzenDataGrid>

<!-- 场景切换按钮示例 -->
<button @onclick="() => SwitchDataSource("Order")">显示订单</button>
<button @onclick="() => SwitchDataSource("User")">显示用户</button>
<button @onclick="() => SwitchDataSource("Product")">显示商品</button>

@code {
    private RadzenDataGrid<IGridItem> gridRef;
    private IList<IGridItem> currentDataSource;
    private string currentScenario;

    // 切换数据源方法
    private void SwitchDataSource(string scenario)
    {
        currentScenario = scenario;
        currentDataSource = scenario switch
        {
            "Order" => GetOrderList().Cast<IGridItem>().ToList(),
            "User" => GetUserList().Cast<IGridItem>().ToList(),
            "Product" => GetProductList().Cast<IGridItem>().ToList(),
            _ => new List<IGridItem>()
        };
        gridRef.Reload();
    }

    // 模拟获取各场景数据
    private List<Order> GetOrderList() => /* 数据逻辑 */;
    private List<User> GetUserList() => /* 数据逻辑 */;
    private List<Product> GetProductList() => /* 数据逻辑 */;
}

2. 使用动态类型(dynamic)

如果三个数据类没有共同属性,且表格列结构完全一致,可将TItem设为dynamic,通过Cast<dynamic>转换数据源实现复用。这种方式没有编译时类型检查,需确保各数据类的属性名称与列配置匹配:

<RadzenDataGrid @ref="gridRef" Data="@currentDataSource" TItem="dynamic" AutoGenerateColumns="false">
    <Columns>
        <RadzenDataGridColumn Property="Id" Title="ID" />
        <RadzenDataGridColumn Property="Name" Title="名称" />
        <RadzenDataGridColumn Property="CreateDate" Title="创建日期" />
    </Columns>
</RadzenDataGrid>

@code {
    private RadzenDataGrid<dynamic> gridRef;
    private IList<dynamic> currentDataSource;

    private void SwitchDataSource(string scenario)
    {
        currentDataSource = scenario switch
        {
            "A" => GetDataA().Cast<dynamic>().ToList(),
            "B" => GetDataB().Cast<dynamic>().ToList(),
            "C" => GetDataC().Cast<dynamic>().ToList(),
            _ => new List<dynamic>()
        };
        gridRef.Reload();
    }
}

注意事项

  • 基类/接口方式具备编译时类型检查,更安全,推荐优先使用;
  • 动态类型方式适合快速实现,但属性名称不匹配时会运行时出错,需谨慎使用;
  • 若列结构差异较大,可在Columns内通过@if分支根据场景渲染对应列,无需拆分多个表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:55:18