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

Blazorise DataGrid的DataGridSelectColumn无法记录选中值求助

问题原因分析

你的代码存在几个关键问题导致下拉选中值无法同步:

  • 使用了全局的selectValue变量,所有编辑行共用同一个值,无法独立维护每行的选中状态
  • SelectedValueChangedHandler仅更新了全局变量,没有将选中的ClassB实例关联到当前编辑的ClassA对象
  • EditTemplate中的Select组件没有正确绑定到当前行的ClassA.B.Id,导致初始值不显示,选中后也无法同步到数据模型
修复方案

修改代码如下,重点调整EditTemplate的绑定逻辑和选中值变更处理:

@page "/temp"
@using Blazorise.DataGrid

<h3>TempComponent</h3>

<DataGrid TItem="ClassA"
          Data="@Classes"
          Editable="true"
          RowUpdated="@OnRowUpdatedAsync">

    <DataGridCommandColumn>
        <EditCommandTemplate>
            <Blazorise.Button Clicked="@context.Clicked"><Icon Name="IconName.Edit" /></Blazorise.Button>
        </EditCommandTemplate>
        <SaveCommandTemplate>
            <Blazorise.Button Clicked="@context.Clicked"><Icon Name="IconName.Save" /></Blazorise.Button>
        </SaveCommandTemplate>
    </DataGridCommandColumn>

    <DataGridColumn TItem="ClassA" Field="@nameof(ClassA.Name)" Caption="Name" Editable="true"/>
    <DataGridSelectColumn TItem="ClassA" Field="@nameof(ClassA.B)" Caption="B" Editable="true">
        <DisplayTemplate>
            @if (context.B != null)
            {
                @context.B.Name
            }
        </DisplayTemplate>
        <EditTemplate>             
            <Select TValue="int" 
                    SelectedValue="@context.B.Id" 
                    SelectedValueChanged="(value) => OnBSelected(value, context)">
                @if (ClassesB != null)
                {
                    foreach (var classB in ClassesB)
                    {
                        <SelectItem Value="@classB.Id">@classB.Name</SelectItem>
                    }
                }
            </Select>
        </EditTemplate>
    </DataGridSelectColumn>
</DataGrid>

@code{
    public class ClassA {
        public string Name { get; set; }
        public ClassB B { get; set;}
    }

    public class ClassB {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    List<ClassA> Classes = new List<ClassA> {
        new ClassA { Name = "Class1", B = new ClassB() { Id = 1, Name = "ClassB1" }},
        new ClassA { Name = "Class2", B = new ClassB() { Id = 2, Name = "ClassB2" }}
    };

    List<ClassB> ClassesB = new List<ClassB> {
        new ClassB { Id = 1, Name = "ClassB1" },
        new ClassB { Id = 2, Name = "ClassB2" }
     };

    protected void OnRowUpdatedAsync(SavedRowItem<ClassA, Dictionary<string, object>> e)
    {
        // 可在这里添加保存到数据源的逻辑
    }

    private void OnBSelected(int selectedId, ClassA currentClassA)
    {
        // 根据选中的Id找到对应的ClassB实例
        var selectedB = ClassesB.FirstOrDefault(b => b.Id == selectedId);
        if (selectedB != null)
        {
            currentClassA.B = selectedB;
        }
    }
}
关键修改点
  • 移除全局selectValue,改为直接绑定当前编辑行的context.B.Id,确保每行独立维护选中状态
  • 将SelectedValueChanged替换为自定义的OnBSelected方法,传入选中的Id和当前编辑的ClassA对象
  • 在OnBSelected中根据Id匹配对应的ClassB实例,直接赋值给当前ClassA的B属性,完成数据同步
  • 确保Select的初始值与当前行的B.Id一致,编辑时默认显示已选中的选项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:15:34