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

Blazor Server下Mudblazor MudDataGrid单元格点击事件捕获求助

MudDataGrid 捕获单元格点击事件解决方案

MudBlazor 的 PropertyColumn 本身并未内置单元格点击事件,直接在标签上添加 onclick 或 @onclick 不会触发。以下是两种可行的实现方案:

方案一:用 TemplateColumn 自定义可点击单元格

将需要捕获点击的 PropertyColumn 替换为 TemplateColumn,在单元格模板内包裹内容并绑定 Blazor 点击事件,可直接获取当前行数据与点击的列信息。

修改后代码示例

<MudDataGrid T="Element" MultiSelection="true" Items="@Elements" SortMode="SortMode.Multiple" QuickFilter="@_quickFilter"
             Hideable="true" RowClick="@RowClicked" SelectedItemsChanged="@SelectedItemsChanged">
    <ToolBarContent>
        <MudSpacer />
        <MudTextField @bind-Value="_searchString" Placeholder="Table Search" Adornment="Adornment.Start" Immediate="true"
                      AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
        <MudButton Style="background-color:coral;color:white;margin-left: 20px;" StartIcon="@Icons.Material.Filled.Add">
            @if (!isMobileDevice)
            {
                <span>New Item</span>
            }
        </MudButton>
    </ToolBarContent>
    <Columns>
        <SelectColumn T="Element" />
        <PropertyColumn Property="x => x.SKU" Title="SKU Number" Sortable="true" Filterable="true" />
        <!-- 将Name列改为TemplateColumn实现点击 -->
        <TemplateColumn Title="Name" Sortable="true" Filterable="true" CellStyleFunc="@_cellStyleFunc">
            <CellTemplate>
                <div @onclick="() => OnCellClick(context.Item, "Name")">
                    @context.Item.Name
                </div>
            </CellTemplate>
        </TemplateColumn>
        <PropertyColumn Property="x => x.Quentity" Title="Qty On-Hand" Sortable="true" Filterable="true" />
        <PropertyColumn Property="x => x.Measurement" Title="UOM" Sortable="true" Filterable="true" />
        <PropertyColumn Property="x => x.Location" Title="Location" Sortable="true" Filterable="true" />
        <PropertyColumn Property="x => x.Type" Title="Type" Sortable="true" Filterable="true" />
        <TemplateColumn CellClass="justify-end">
            <CellTemplate>
                <MudMenu Icon="@Icons.Material.Filled.MoreVert" AnchorOrigin="@Origin.BottomLeft" TransformOrigin="@Origin.TopRight">
                    <MudMenuItem Icon="@Icons.Material.Outlined.Edit">Edit</MudMenuItem>
                    <MudMenuItem Icon="@Icons.Material.Outlined.ContentCopy">Duplicate</MudMenuItem>
                    <MudMenuItem Icon="@Icons.Material.Outlined.MultipleStop">Transfer Qty</MudMenuItem>
                    <MudMenuItem Icon="@Icons.Material.Outlined.Archive">Archive</MudMenuItem>
                </MudMenu>
            </CellTemplate>
        </TemplateColumn>
    </Columns>
    <PagerContent>
        <MudDataGridPager T="Element" />
    </PagerContent>
</MudDataGrid>

对应的C#处理方法

private void OnCellClick(Element item, string columnName)
{
    // 这里可获取点击的行数据与列名,执行业务逻辑
    Console.WriteLine($"点击单元格:列名={columnName},SKU={item.SKU}");
}

该方案直观简洁,无需JS介入,适合单个或少数需要点击的列场景。

方案二:JS互操作全局捕获单元格点击

若需给所有单元格添加点击事件,可通过JS监听表格单元格点击,再将数据传递回Blazor处理。

步骤1:添加JS代码

window.registerGridCellClick = function(componentRef) {
    document.addEventListener('click', function(e) {
        const cell = e.target.closest('.mud-table-cell');
        if (!cell) return;
        
        const row = cell.closest('.mud-table-row');
        const item = JSON.parse(row.getAttribute('data-item'));
        const cellIndex = Array.from(row.children).indexOf(cell);
        const columns = Array.from(row.parentElement.parentElement.querySelectorAll('.mud-table-header-cell'))
                            .map(c => c.textContent.trim());
        const columnName = columns[cellIndex];
        
        componentRef.invokeMethodAsync('OnGridCellClicked', item, columnName);
    });
};

步骤2:Blazor组件内绑定与处理

private DotNetObjectReference<YourComponent>? _componentRef;

protected override async Task OnInitializedAsync()
{
    _componentRef = DotNetObjectReference.Create(this);
    await JS.InvokeVoidAsync("registerGridCellClick", _componentRef);
}

[JSInvokable]
public void OnGridCellClicked(Element item, string columnName)
{
    // 处理单元格点击逻辑
    Console.WriteLine($"点击单元格:列名={columnName},SKU={item.SKU}");
    StateHasChanged();
}

public void Dispose()
{
    _componentRef?.Dispose();
}

该方案适合全局批量配置单元格点击事件的场景,一次注册即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:02:55