0

我有一个与后端 SQL 数据库绑定的 SyncFusion 数据网格。我的 crud 操作是通过调用对话框的自定义按钮调用的。

这很好用,只是在添加/编辑/删除后网格不使用后端数据进行更新。我已经厌倦了刷新网格,但这似乎不起作用。

我需要做什么?

我的模板.razor

@page "/My_Templates"
@using WireDesk.Models
@inject IWireDeskService WireDeskService


<ReusableDialog @ref="dialog"></ReusableDialog>

<SfGrid @ref="Grid" DataSource="@Templates" TValue="Template" AllowSorting="true" Toolbar="ToolbarItems">
    <GridEvents OnToolbarClick="OnClicked" TValue="Template"></GridEvents>
    <GridColumns>
        <GridColumn Field=@nameof(Template.Owner) HeaderText="Owner" ValidationRules="@(new ValidationRules { Required = true })" Width="120"></GridColumn>
        <GridColumn Field=@nameof(Template.Users) HeaderText="Users" TextAlign="TextAlign.Left" Width="130"></GridColumn>
        <GridColumn Field=@nameof(Template.Description) HeaderText="Description" TextAlign="TextAlign.Left" Width="130"></GridColumn>
        <GridColumn Field=@nameof(Template.FundType) HeaderText="Fund Type" TextAlign="TextAlign.Left" Width="120"></GridColumn>
    </GridColumns>
</SfGrid>

@code{

    //Instantiate objects
    SfGrid<Template> Grid { get; set; }
    ReusableDialog dialog;

    //Instantiate toolbar and toolbar items
    private List<Object> ToolbarItems = new List<Object>()
{
    new ItemModel() { Text = "Create New Template", TooltipText = "Add", PrefixIcon = "e-icons e-update", Id = "Add", },
    new ItemModel() { Text = "Edit Template", TooltipText = "Edit", PrefixIcon = "e-icons e-update", Id = "Edit"}
};

    //Instatiate records
    public IEnumerable<Template> Templates { get; set; }

    //Instantiate Records
    protected override void OnInitialized()
    {
        Templates = WireDeskService.GetTemplates();
    }

    //Handle toolbar clicks
    public async Task OnClicked(Syncfusion.Blazor.Navigations.ClickEventArgs Args)
    {
        //Create Record
        if (Args.Item.Id == "Add")
        {
            Args.Cancel = true; //Prevent the default action
            dialog.Title = "This is the Add Title";
            dialog.Text = "This is the add text";
            dialog.template = new Template();
            dialog.OpenDialog();
            WireDeskService.InsertTemplate(dialog.template);
            //Grid.CallStateHasChanged();                            Doesn't Work
            //Templates = WireDeskService.GetTemplates();            Doesn't Work
        }

        //Edit Records
        if (Args.Item.Id == "Edit")
        {
            Args.Cancel = true; //Prevent the default action
            var selected = await Grid.GetSelectedRecordsAsync();
            if (selected.Count > 0)
            {
                //Call Dialog Box Here
                dialog.Title = "This is the Edited Title";
                dialog.Text = "This is the edited text";
                dialog.template = selected[0];
                dialog.OpenDialog();
                WireDeskService.UpdateTemplate(dialog.template.TemplateId, dialog.template);
                Grid.CallStateHasChanged();
            }
        }
    }
}

<style>

    .e-altrow {
        background-color: rgb(182 201 244);
    }
</style>

WireDeskService.cs

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;

namespace WireDesk.Models
{
    public class WireDeskService : IWireDeskService

    {

        private WireDeskContext _context;
        public WireDeskService(WireDeskContext context)
        {
            _context = context;
        }

        public void DeleteTemplate(long templateId)
        {
            try
            {
                Template ord = _context.Templates.Find(templateId);
                _context.Templates.Remove(ord);
                _context.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public IEnumerable<Template> GetTemplates()
        {
            try
            {
                return _context.Templates.ToList();
            }
            catch
            {
                throw;
            }
        }
        public void InsertTemplate(Template template)
        {
            try
            {
                _context.Templates.Add(template);
                _context.SaveChanges();
            }
            catch
            {
                throw;
            }
        }
        public Template SingleTemplate(long id)
        {
            throw new NotImplementedException();
        }
        public void UpdateTemplate(long templateId, Template template) {

            try
            {
                var local = _context.Set<Template>().Local.FirstOrDefault(entry => entry.TemplateId.Equals(template.TemplateId));
                // check if local is not null
                if (local != null)
                {
                    // detach
                    _context.Entry(local).State = EntityState.Detached;
                }
                _context.Entry(template).State = EntityState.Modified;
                _context.SaveChanges();
            }
            catch
            {
                throw;
            }
        }
        void IWireDeskService.SingleTemplate(long templateId)
        {
            throw new NotImplementedException();
        }
    }
}
4

1 回答 1

0

我们已经分析了您的查询,并且我们了解您希望在使用 DataSource 属性将数据绑定到 Grid 时将更改保存在数据库中。我们想通知您,当使用 DataSource 属性将数据绑定到 Grid 组件时,需要使用 ActionEvents(OnActionComplete 和 OnActionBegin)来处理 CRUD 操作。

OnActionBegin 事件 – 将在启动特定操作时触发。
OnActionComplete 事件 - 将在某些操作完成时触发。

我们建议您在 RequestType 为 Save 时使用 Grid 的 OnActionBegin 事件来实现您在数据库中保存更改的要求。保存记录时,无论添加或更新操作如何。当 RequestType 为 Save 时会触发 OnActionBegin 事件。在这种情况下,我们可以将更改更新到数据库中。

由于添加和编辑操作共享相同的请求类型“保存”,我们可以使用 Args.Action 参数区分当前操作。同样,我们要求您从数据库中获取更新的数据并在 Grid 的 OnActionComplete 事件中绑定到 Grid。

请参阅下面的代码示例。


<SfGrid @ref="Grid" DataSource="@GridData" Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })" AllowFiltering="true" AllowSorting="true" AllowPaging="true"> 
    <GridEditSettings AllowAdding="true" AllowDeleting="true" AllowEditing="true"></GridEditSettings> 
    <GridEvents OnActionBegin="OnBegin" OnActionComplete="OnComplete" TValue="Order"></GridEvents> 
    <GridColumns> 
        <GridColumn Field=@nameof(Order.OrderID) HeaderText="Order ID" IsIdentity="true" IsPrimaryKey="true" TextAlign="TextAlign.Right" Width="120"></GridColumn> 
        <GridColumn Field=@nameof(Order.CustomerID) HeaderText="Customer Name" Width="150"></GridColumn> 
        <GridColumn Field=@nameof(Order.EmployeeID) HeaderText="Id" Width="150"></GridColumn> 
    </GridColumns> 
</SfGrid> 
@code{ 
    SfGrid<Order> Grid { get; set; } 
    public IEnumerable<Order> GridData { get; set;} 
    protected override void OnInitialized() 
    { 
        GridData = OrderData.GetAllOrders().ToList(); 
    } 
    public void OnComplete(ActionEventArgs<Order> Args) 
    { 
        if (Args.RequestType == Syncfusion.Blazor.Grids.Action.Save || Args.RequestType == Syncfusion.Blazor.Grids.Action.Refresh) 
        { 
            GridData = OrderData.GetAllOrders().ToList(); // fetch updated data from service and bind to grid datasource property 
        } 
    } 
    public void OnBegin(ActionEventArgs<Order> Args) 
    { 
        if (Args.RequestType == Syncfusion.Blazor.Grids.Action.Save) // update the changes in Actionbegine event 
        { 
            if (Args.Action == "Add") 
            { 
                //Args.Data contain the inserted record details 
                //insert the data into your database 
                OrderData.AddOrder(Args.Data); 
            } 
            else 
            { 
                //Args.Data contain the updated record details 
                //update the data into your database 
                OrderData.UpdateOrder(Args.Data); 
            } 
        }        else if (Args.RequestType == Syncfusion.Blazor.Grids.Action.Delete) 
        { 
            OrderData.DeleteOrder(Args.Data.OrderID); // delete the record from your database 
        } 
    } 
} 

请参阅我们的 UG 文档以供参考 https://blazor.syncfusion.com/documentation/datagrid/events/#onactionbegin
https://blazor.syncfusion.com/documentation/datagrid/events/#onactioncomplete

于 2021-10-21T17:12:22.103 回答