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

