微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Blazorise DataGrid EditTemplate 中使用自定义组件

如何解决如何在 Blazorise DataGrid EditTemplate 中使用自定义组件

我有一个 Blazorise DataGrid EditTemplate 这样:

            <EditTemplate>
                <Select TValue="int" SelectedValue="@((int)( context.CellValue ))" SelectedValueChanged="@(( v ) => context.CellValue = v)">
                    <SelectItem TValue="int" Value="0">All</SelectItem>
                    <SelectItem TValue="int" Value="1">Option 1</SelectItem>
                    <SelectItem TValue="int" Value="2">Option 2</SelectItem>
                </Select>
            </EditTemplate>

效果很好。我想把它变成我可以重用的自定义组件,所以创建了以下内容

SourcesEdit.razor:

<Select TValue="int" SelectedValue="@((int)( sourceId ))" SelectedValueChanged="@(( v ) => sourceId = v)">
    <SelectItem TValue="int" Value="0">All</SelectItem>
    <SelectItem TValue="int" Value="1">Option 1</SelectItem>
    <SelectItem TValue="int" Value="2">Option 2</SelectItem>
</Select>


@code {
    [Parameter]
    public int sourceId { get; set; }

}

我打电话的对象

            <EditTemplate>
                <SourcesEdit sourceId="@((int)( context.CellValue ))" />
            </EditTemplate>

Select 组件显示并正确运行,但单击保存后选择未反映在网格中。

我做错了什么?

解决方法

下面的代码示例说明了如何创建一个自定义组件,该组件显示一个值(部门)列表,供用户在编辑模式下进行选择。选择的选项是显示模式下显示的值。如果添加新员工,则所选值为字符串“Select...”

EditComponent.razor

    @typeparam TValue
    
    <Select SelectedValue="SelectedValue" SelectedValueChanged="SelectedValueChanged">
           <SelectItem TValue="string" Value="null">Select...</SelectItem>
            @foreach (var department in Departments)
             {
                 <SelectItem TValue="string" Value="@department">@department</SelectItem>
    
             }
    </Select>
    
    
    @code {
        public List<string> Departments {get;set;} = new List<string> {"Sales","IT","Accounting"};
    
        [Parameter]
        public TValue SelectedValue { get; set; }
    
    
        [Parameter]
        public EventCallback<TValue> SelectedValueChanged { get; set; }
    }

这就是在 DataGrid 的 EditTemplate 模板中嵌入 EditComponent 的方式。复制和测试...

用法:

@using System.ComponentModel.DataAnnotations

<DataGrid TItem="Employee"
        Data="@employees"
        TotalItems="@totalEmployees"
        Editable="true">
    <DataGridColumns>
    <DataGridCommandColumn TItem="Employee" Width="170px">
         <NewCommandTemplate>
             <Button Color="Color.Success" 
                   Clicked="@context.Clicked">New</Button>
         </NewCommandTemplate>
         <EditCommandTemplate>
             <Button Color="Color.Primary" 
                   Clicked="@context.Clicked">Edit</Button>
         </EditCommandTemplate>
         <SaveCommandTemplate>
            <Button Color="Color.Primary" 
                   Clicked="@context.Clicked">Save</Button>
          </SaveCommandTemplate>
          <DeleteCommandTemplate>
            <Button Color="Color.Danger" 
                   Clicked="@context.Clicked">Delete</Button>
          </DeleteCommandTemplate>
        <CancelCommandTemplate>
            <Button Color="Color.Secondary" 
                   Clicked="@context.Clicked">Cancel</Button>
        </CancelCommandTemplate>
                            
    </DataGridCommandColumn>                    

    <DataGridColumn TItem="Employee" Field="@nameof(Employee.ID)" Caption="#" Sortable="false" />
    <DataGridColumn TItem="Employee" Field="@nameof(Employee.FirstName)" Caption="First Name" Editable="true" />
    <DataGridColumn TItem="Employee" Field="@nameof(Employee.LastName)" Caption="Last Name" Editable="true" />
    <DataGridColumn TItem="Employee" Field="@nameof(Employee.Salary)" Caption="Salary" Editable="true">
        <DisplayTemplate>
            @($"{( context as Employee )?.Salary}")
        </DisplayTemplate>
        <EditTemplate>
            <NumericEdit TValue="decimal" Value="@((decimal)(((CellEditContext)context).CellValue))" ValueChanged="@(v=>((CellEditContext)context).CellValue=v)" />
        </EditTemplate>
    </DataGridColumn>

    <DataGridSelectColumn TItem="Employee" Field="@nameof(Employee.Department)" Caption="Department" Editable="true" >
        <DisplayTemplate>
            @($"{( context as Employee ).Department}")
        </DisplayTemplate>
        <EditTemplate>
            <EditComponent TValue="string" SelectedValue="@((string)(((CellEditContext)context)?.CellValue))" 
                                             SelectedValueChanged="@(( v ) => context.CellValue = v)"/>
        </EditTemplate>
    </DataGridSelectColumn>
</DataGridColumns>

    
</DataGrid>

@code {

   private List<Employee> employees = new List<Employee> {
         new Employee{ ID = 1,FirstName = "Nancy",LastName = "Davolio",Salary = 1000.0M,Department = "Sales" },new Employee{ ID = 2,FirstName = "Andrew",LastName = "Cohen",Salary = 2000.0M,Department = "IT" },new Employee{ ID = 3,FirstName = "David",LastName = "Copperfield",Salary = 3000.0M,Department =  "Accounting" }
     };
  private int totalEmployees = 3;
 
    public class Employee
    {
        public int ID {get;set;}
        public string FirstName {get;set;}
        public string LastName {get;set;}
        public decimal Salary {get;set;}
        
  #nullable enable  
        [Required]
        public string? Department {get;set;}
    #nullable disable   
    }
 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。