范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

硬核BootstrapBlazorTable综合演示例子

  知识点:
  1.导入导出
  2.分页功能
  3.增删改查
  4.批量删除
  5.批量编辑(审核)
  6.列排序与列搜索
  7.顶部搜索实现所有列搜索
  8.高级搜索实现多条件搜索
  9.顶部与刷新与视图列
  10.实现文本类型明细行
  11.列的统计
  12.隐藏列,时间日期列格式化
  13.新窗口打开
  14.随机数据
  15.自由编辑
  16.清空数据
  17.模板下载 截图
  基础工程
  表格组件导出 Excel Word Html Pdf
  Wiki - Gitee.com注入FreeSqlDataService服务,支持全数据导出
  更新包  
  Program.cs   添加代码using Densen.DataAcces.FreeSql; builder.Services.AddSingleton(typeof(FreeSqlDataService<>)); builder.Services.ConfigureJsonLocalizationOptions(op => {     // 忽略文化信息丢失日志     op.IgnoreLocalizerMissing = true; }); Index.razor添加一个 TabItem
  Tab 顺便改为懒加载      ...                     添加打印预览Pages_Host.cshtml
  < / body > 前加一句     数据实体类DataSalesChannels.cs
  查看代码using BootstrapBlazor.Components; using DocumentFormat.OpenXml.Wordprocessing; using FreeSql.DataAnnotations; using Magicodes.ExporterAndImporter.Excel; using OfficeOpenXml.Table; using System.ComponentModel; using System.ComponentModel.DataAnnotations;   namespace b14table.Data;  [ExcelImporter(IsLabelingError = true)] [ExcelExporter(Name = "导入商品中间表", TableStyle = TableStyles.Light10, AutoFitAllColumn = true)] [AutoGenerateClass(Searchable = true, Filterable = true, Sortable = true, ShowTips = true)]  public class SalesChannels {     [AutoGenerateColumn(Ignore = true)]     [Column(IsIdentity = true)]     [DisplayName("序号")]     public int ID { get; set; }      [AutoGenerateColumn(ComponentType = typeof(ColorPicker), Width = 30)]     [DisplayName("级别")]     public string? Background { get; set; }      [AutoGenerateColumn(FormatString = "yyyy-MM-dd")]     [DisplayName("日期")]     public DateTime Date { get; set; }      [Required(ErrorMessage = "{0}不能为空")]     [DisplayName("名称")]     public string? Name { get; set; }      [DisplayName("项目数量")]     public int Projects { get; set; }      [DisplayName("交单数量")]     public int Orders { get; set; }      [DisplayName("结单数量")]     public int Checkouts { get; set; }      // 编辑界面无法显示小数, 以后再思考     [DisplayName("结单率")]     [AutoGenerateColumn(Readonly = true)]     public string? CheckoutRates { get => GetCheckoutRates(Checkouts, Orders); set => checkoutRates = value; }     string? checkoutRates;       [DisplayName("合格数量")]     public int Qualifieds { get; set; }      [DisplayName("合格率")]     [AutoGenerateColumn(Readonly = true)]     public string? QualifiedRates { get => GetQualifiedRates(Qualifieds, Checkouts); set => qualifiedRates = value; }     string? qualifiedRates;      [DisplayName("总价值")]     public int Total { get; set; }      [DisplayName("应收款")]     public int Receivables { get; set; }      [DisplayName("已收款")]     public int Received { get; set; }      [AutoGenerateColumn(FormatString = "HH:mm:ss")]     [DisplayName("修改日期")]     public DateTime ModifiedDate { get; set; } = DateTime.Now;      [AutoGenerateColumn(TextEllipsis = true, Visible = false, ShowTips = true, ComponentType = typeof(Textarea))]     [DisplayName("备注")]     public string? Remark { get; set; }      [AutoGenerateColumn(Visible = false, ComponentType = typeof(BootstrapInput), Width = 80)]     [DisplayName("Test1")]     public decimal Test1 { get; set; }      private string GetCheckoutRates(int checkouts, int orders) => orders > 0 ? (checkouts /(double) orders).ToString("P2") : "0%";      private string GetQualifiedRates(int qualifieds, int checkouts) => checkouts > 0 ? (qualifieds / (double)checkouts).ToString("P2") : "0%";   }  页面PagesImpExpIII.razor
  查看代码@page "/impexpiii" @using b14table.Data  @using static Blazor100.Service.ImportExportsService  综合演示   
true" ShowCardView="true" ShowColumnList="true" ShowFooter="true" ScrollingDialogContent="true" EditDialogIsDraggable="true" EditDialogSize="Size.ExtraLarge" EditDialogShowMaximizeButton="true" ShowExportButton OnExportAsync="ExportAsync" PageItemsSource="new int[] {10, 20, 50, 100, 200, 500, 1000 }"> 备注: @context.Remark
当前页数据
ExportExcelAsync(list1.Rows)"> Excel ExportWordAsync(list1.Rows)"> Word ExportHtmlAsync(list1.Rows)"> Html ExportPDFAsync(list1.Rows)"> PDF
全部数据
ExportExcelAsync(DataService.GetAllItems())"> Excel ExportWordAsync(DataService.GetAllItems())"> Word ExportHtmlAsync(DataService.GetAllItems())"> Html ExportPDFAsync(DataService.GetAllItems())"> PDF
页面代码PagesImpExpIII.razor   查看代码using AmeBlazor.Components; using b14table.Data; using Blazor100.Service; using BootstrapBlazor.Components; using Densen.DataAcces.FreeSql; using DocumentFormat.OpenXml.Spreadsheet; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; using Microsoft.JSInterop; using System.Diagnostics.CodeAnalysis; using static Blazor100.Service.ImportExportsService; namespace b14table.Pages { public partial class ImpExpIII { [Inject] IWebHostEnvironment? HostEnvironment { get; set; } [Inject] [NotNull] NavigationManager? NavigationManager { get; set; } [Inject] [NotNull] ImportExportsService? ImportExportsService { get; set; } [Inject] [NotNull] ToastService? ToastService { get; set; } [Inject] [NotNull] FreeSqlDataService? DataService { get; set; } [NotNull] Table? list1 { get; set; } [Parameter] public int Footercolspan1 { get; set; } = 3; [Parameter] public int Footercolspan2 { get; set; } = 2; [Parameter] public int Footercolspan3 { get; set; } [Parameter] public int FootercolspanTotal { get; set; } = 2; [Parameter] public string? FooterText { get; set; } = "合计:"; [Parameter] public string? FooterText2 { get; set; } [Parameter] public string? FooterText3 { get; set; } [Parameter] public string? FooterTotal { get; set; } /// /// 获得/设置 IJSRuntime 实例 /// [Inject] [NotNull] protected IJSRuntime? JsRuntime { get; set; } [Parameter] public string? 新窗口打开Url { get; set; } = "https://localhost:7292/"; // 由于使用了FreeSql ORM 数据服务,可以直接取对象 [Inject] [NotNull] IFreeSql? fsql { get; set; } [Inject] ToastService? toastService { get; set; } [Inject] SwalService? SwalService { get; set; } public bool IsExcel { get; set; } public bool DoubleClickToEdit { get; set; } = true; protected string UploadPath = ""; protected string? uploadstatus; long maxFileSize = 1024 * 1024 * 15; string? tempfilename; private AggregateType Aggregate { get; set; } protected async Task GetDatasAsync() { var datas = GetDemoDatas(); await fsql.Insert().AppendData(datas).ExecuteAffrowsAsync(); await list1!.QueryAsync(); } protected override async void OnAfterRender(bool firstRender) { if (firstRender) { UploadPath = Path.Combine(HostEnvironment!.WebRootPath, "uploads"); if (!Directory.Exists(UploadPath)) Directory.CreateDirectory(UploadPath); await list1!.QueryAsync(); } } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { //懒的人,直接初始化一些数据用用 var res = fsql.Select().Count(); if (res == 0) { var datas = GetDemoDatas(); await fsql.Insert().AppendData(datas).ExecuteAffrowsAsync(); await list1!.QueryAsync(); } } } public List GetDemoDatas() { var list = new List(); for (int i = 0; i < 100; i++) { try { var total = Random.Shared.Next(100, 3000); list.Add(new SalesChannels() { ID = i, Name = "渠道" + i, Date = DateTime.Now, Projects = Random.Shared.Next(10, 55), Orders = Random.Shared.Next(3, 10), Qualifieds = i, Total = total, Receivables = total - i, Received = i, Remark= #34;{i} 明细行内嵌套另外一个 Table 组件,由于每行都要关联子表数据,出于性能的考虑,此功能采用 懒加载 模式,即点击展开按钮后,再对嵌套 Table 进行数据填充,通过 ShowDetailRow 回调委托可以控制每一行是否显示明细行,本例中通过 Complete 属性来控制是否显示明细行,可通过翻页来测试本功能" }); } catch (Exception e) { System.Console.WriteLine(e.Message); } } return list; } private Task IsExcelToggle() { IsExcel = !IsExcel; DoubleClickToEdit = !IsExcel; StateHasChanged(); return Task.CompletedTask; } public async Task Export模板Async() { await Export(); return true; } private async Task ExportExcelAsync(IEnumerable items) => await ExportAutoAsync(items, ExportType.Excel); private async Task ExportPDFAsync(IEnumerable items) => await ExportAutoAsync(items, ExportType.Pdf); private async Task ExportWordAsync(IEnumerable items) => await ExportAutoAsync(items, ExportType.Word); private async Task ExportHtmlAsync(IEnumerable items) => await ExportAutoAsync(items, ExportType.Html); private async Task ExportAutoAsync(IEnumerable items, ExportType exportType = ExportType.Excel) { if (items == null || !items.Any()) { await ToastService.Error("提示", "无数据可导出"); return false; } var option = new ToastOption() { Category = ToastCategory.Information, Title = "提示", Content = #34;导出正在执行,请稍等片刻...", IsAutoHide = false }; // 弹出 Toast await ToastService.Show(option); await Task.Delay(100); // 开启后台进程进行数据处理 await Export(items?.ToList(), exportType); // 关闭 option 相关联的弹窗 option.Close(); // 弹窗告知下载完毕 await ToastService.Show(new ToastOption() { Category = ToastCategory.Success, Title = "提示", Content = #34;导出成功,请检查数据", IsAutoHide = false }); return true; } private async Task Export(List? items = null, ExportType exportType = ExportType.Excel) { try { if (items == null || !items.Any()) { ToastService?.Error(#34;导出", #34;{exportType}出错,无数据可导出"); return; } var fileName = items == null ? "模板" : typeof(SalesChannels).Name; var fullName = Path.Combine(UploadPath, fileName); fullName = await ImportExportsService.Export(fullName, items, exportType); fileName = (new System.IO.FileInfo(fullName)).Name; ToastService?.Success("提示", fileName + "已生成"); //下载后清除文件 NavigationManager.NavigateTo(#34;uploads/{fileName}", true); _ = Task.Run(() => { Thread.Sleep(50000); System.IO.File.Delete(fullName); }); } catch (Exception e) { ToastService?.Error(#34;导出", #34;{exportType}出错,请检查. {e.Message}"); } } public async Task EmptyAll() { fsql.Delete().Where(a => 1 == 1).ExecuteAffrows(); await ToastService!.Show(new ToastOption() { Category = ToastCategory.Success, Title = "提示", Content = "已清空数据", }); await list1!.QueryAsync(); return true; } private async Task ImportExcel() { if (string.IsNullOrEmpty(tempfilename)) { ToastService?.Error("提示", "请正确选择文件上传"); return; } var option = new ToastOption() { Category = ToastCategory.Information, Title = "提示", Content = "导入文件中,请稍等片刻...", IsAutoHide = false }; // 弹出 Toast await ToastService!.Show(option); await Task.Delay(100); // 开启后台进程进行数据处理 var isSuccess = await MockImportExcel(); // 关闭 option 相关联的弹窗 option.Close(); // 弹窗告知下载完毕 await ToastService.Show(new ToastOption() { Category = isSuccess ? ToastCategory.Success : ToastCategory.Error, Title = "提示", Content = isSuccess ? "操作成功,请检查数据" : "出现错误,请重试导入或者上传", IsAutoHide = false }); await list1!.QueryAsync(); } private async Task MockImportExcel() { var items_temp = await ImportExportsService!.ImportFormExcel(tempfilename!); if (items_temp.items == null) { ToastService?.Error("提示", "文件导入失败: " + items_temp.error); return false; } //items = SmartCombine(items_temp, items).ToList(); 新数据和老数据合并处理,略100字 await fsql.Insert().AppendData(items_temp!.items.ToList()).ExecuteAffrowsAsync(); return true; } protected async Task OnChange(InputFileChangeEventArgs e) { if (e.File == null) return; tempfilename = Path.Combine(UploadPath, e.File.Name); await using FileStream fs = new(tempfilename, FileMode.Create); using var stream = e.File.OpenReadStream(maxFileSize); await stream.CopyToAsync(fs); //正式工程此处是回调,简化版必须InvokeAsync一下,自由发挥 _ = Task.Run(async () => await InvokeAsync(async () => await ImportExcel())); } /// /// 导出数据方法 /// /// /// /// protected async Task ExportAsync(IEnumerable Items, QueryPageOptions opt) { var ret = await ExportExcelAsync(Items); return ret; } public Task PrintPreview(IEnumerable item) { //实际工程自己完善js打印 JsRuntime.InvokeVoidAsync("printDiv"); return Task.CompletedTask; } private Task 新窗口打开() { if (string.IsNullOrEmpty(新窗口打开Url)) { ToastService?.Error("提示", "Url为空!"); return Task.CompletedTask; } JsRuntime.NavigateToNewTab(新窗口打开Url); return Task.CompletedTask; } public async Task 批量审批(IEnumerable items) { items.ToList().ForEach(a => { a.Checkouts = a.Orders; a.Receivables = 0; a.Received = a.Total; a.ModifiedDate = DateTime.Now; }); var res = await fsql.Update().SetSource(items).ExecuteAffrowsAsync(); await SwalService!.Show(new SwalOption() { Title = res == 0 ? "提示: 操作失败" : "提示: 操作成功" }); if (res != 0) await list1!.QueryAsync(); } } } 预览   源代码   https://gitee.com/densen2014/Blazor100/tree/master/b04table   https://git可hu删b.com/densen2014/Blazor100/tree/master/b04table项目地址   https://gitee.com/LongbowEnterprise/BootstrapBlazor项目Wiki   https://gitee.com/LongbowEnterprise/BootstrapBlazor/wikis/QuickStart/[硬核] Table 综合演示例子?sort_id=7452536关联项目   FreeSql   BA & Blazor 知识共享许可协议   本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名AlexChow,不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系 。转载声明   本文来自博客园,作者:周创琳 AlexChow,转载请注明原文链接:https://www.cnblogs.com/densen2014/p/17053020.htmlAlexChow   今日头条 | 博客园 | 知乎 | Gitee

毛主席赠给尼克松4两茶叶,总统不满意,周总理这可是半壁江山1971年7月15日晚上时任美国总统的尼克松在电视广播中发表了三分钟的演讲。尼克松此次演讲正是关于要访问北京的消息。这一重大决定地宣布在全世界立刻掀起了一波浪潮。1972年,尼克松千年墓葬现10吨黄金,墓主人生前富可敌国,专家感叹汉多黄金于是高帝曰吾乃今日知为皇帝之贵也。乃拜叔孙通为太常,赐金五百斤。叔孙通出,皆以五百斤赐诸生。史记叔孙通传前言古代帝王赏赐臣子是很正常的事情,根据史学家研究发现,西汉自建国以来赏赐的发布十个月下跌2300元,256GB6400万,IP68防水旗舰售价大跳水手机降价在手机行业中是很正常的一种现象,但是不同品牌的机型降价速度却是不一样的,例如苹果手机的降价速度往往要比华为手机更快一些,不过要说降价速度最快的手机品牌还得是三星,尤其是在中茶叶会过期吗?茶叶一般保质期多久?很多人都喜欢喝茶,通过喝茶可以去油解腻,还能保持身体健康。茶叶也有很多种类,有人爱喝绿茶,有人爱喝红茶。那么,你喝了这么多年的茶,知道茶叶有无保质期吗?茶叶作为食品,也是有保质期的银河系旋臂断裂,是什么原因导致的?它会对地球产生影响吗?古时候,由于人类的科技不够发达,所以古人一直都觉得地球就是唯一的世界,而太阳和月球都在围绕地球转动,后来随着人类科技的进步,人类发明了天文望远镜并且还走出了地球,人类走出地球之后才小沈阳女儿长成高级脸,15岁做美甲气质显成熟,调侃自己眼睛小近日,知名笑星小沈阳的女儿在社交平台晒出日常视频,引发网友热议。小沈阳的女儿今年已经15岁了,她的颜值和小时候有着很大的差别,已经长成了高级脸。她穿着一件绿色的卫衣,皮肤白嫩气质成蓝眼睛说伊朗语的白种人,穿着中国军装,守护着中国边疆中国是一个多民族国家,漫长的边境线内,辽阔的疆土上哺育了五十六个民族。灿烂的历史文化在几千年里吸引了许多非汉族人,包容和融合的品性滋养了四面八方来华的人。在中国西北的边境线上,就驻统一加速!国台办发布两岸交通规划后,福建开展外敌破坏应急演练日前,国台办在例行新闻发布会上回答记者提问时,印证了福建省此前发布的关于探索海峡两岸融合发展新路的实施意见,尤其是在谈到推进台海通道项目时,发言人朱凤莲明确指出,推进两岸应通尽通,装备冰霜冲击巨变,程咬金廉颇双喜临门,原初遗珠再次升级文可儿游戏说原创最近王者荣耀官方爆料了一些关于游戏的内容,其中有关于皮肤的,这个月会爆料四款皮肤的优化进度,其中就有阿珂的暗夜猫娘。除了皮肤优化之外,还有关于游戏内的装备的,这次官Steam秋季特卖进入倒计时,推荐10款剁手游戏,纷纷低至奶茶价Steam秋季特卖将在今天结束,观望的玩家们可不要再犹豫的,喜欢什么游戏赶紧买,不然错过等半年。今天为大家推荐10款值得剁手的游戏,一杯奶茶钱就可入手,价格只能说真香。方舟生存进化除了枪硬没优点?NH细节稀碎与吃鸡擦肩而过!解说米饭被点名批评除了枪硬没优点?NH细节稀碎与吃鸡擦肩而过!解说米饭被点名批评绝地求生PGC全球总决赛从11月19日到12月19日全面开战,共计32支来自各大赛区的队伍将在这片赛场决出最终的冠军。
从8999元跌至2499元,折叠屏骁龙8552K屏OIS光学防抖目前已经有很多手机品牌推出折叠屏手机,包括三星华为小米和OPPO等品牌,然而这些品牌推出的折叠屏都是比较昂贵的,特别是三星和华为的折叠屏手机,华为最为昂贵,三星其次,小米和OPPO刘诗雯不退役原因曝光!刘国梁其实早有安排,如今是时候该坦白了刘诗雯在全运会之后就进入到了休息模式,她没有参加世乒赛也没有参加WTT世界杯。在今年的东京奥运会中,刘诗雯搭档许昕参加了混双项目,并且拿到了银牌。刘诗雯的目标是金牌,在输掉比赛以后给足面子!央视总结国乒年终成绩,丝毫不提许昕刘诗雯奥运丢金近日,央视记者李武军进行了国乒本赛季的总结。他作为乒乓球队的随队记者,在本年度一直跟随国乒参加了各项赛事,并且对他们进行了追踪报道,在他的年终总结中谈到了很多选手的成长问题,不过他1胜10负!跌到谷底,超级巨星就这?还想1。1亿美金?霍华德真冤一人一城?如今NBA联盟之中保持一人一城想法的球员越来越少,库里还算,提前续约之后,库里大概率要在勇士打到退役了。NBA里面,很多球星既想要超级顶薪,也想要冲冠豪阵,但是巨头阵容,百家大战曝出假赛丑闻?饿了么战队为夺冠请外援,领队亲口承认众所周知现如今国内电子竞技游戏圈简直可以称得上是热度最高的行业,期间多种类型晋级游戏赛事的成功举办不仅令游戏本身充满了话题度,更是令所有观众们大饱眼福。与此同时随着电竞行业热度的不39岁袁弘也逐渐姨化,绿色卫衣配印花丝巾,比张歆艺穿得还艳想必有很多人认为,时尚与潮流都只是年轻人的事。等人到中年,当了父母之后,只管穿得舒服就行,朴素平淡一点也没关系。其实大可不必!无论是接近或已处在不惑之年,也照样可以穿出自己的风格,山水耕读心欢喜,人间胜景总如春2021生机大会车,驶在去往当地有名的耕读小镇的路上,天就开始飘起了濛濛细雨。人还在停车场,就被远处雨中的风景所深深吸引住了。一排排错落有致古色古香的院落,是那么的娇柔那么的安静,三大官媒皆点名,孙铭徽回怼质疑,杜峰确需反思举一反三了继辽宁对阵广东,胡明轩接连垫脚郭艾伦与赵继伟,威姆斯肘击韩德君差点引发冲突后,广东和广厦的比赛中,曾繁日再次垫脚孙铭徽,广东队一些列的恶犯成功将自己送到了舆论的漩涡中,特别是被三大杜兰特34分11板8助攻,篮网残阵力克76人获4连胜篮网114105击败76人获得4连胜,后者遭遇3连败。篮网人手短缺,哈登阿尔德里奇等6人触发健康安全协议缺阵,开场杜兰特克拉克斯顿米尔斯连中4球,76人这边小库里米尔顿丹尼格林3记艾克森抵达巴西,巴甲难寻下家或彻底失业,不听郑智劝阻付代价北京时间12月17日,艾克森携妻儿已经顺利地抵达了巴西老家,目前艾克森决定进行短暂的休整之后,将会重返巴甲联赛踢球,这也意味着这位里皮爱徒昔日的中超金靴自从2012年加盟中超联赛以2021年收入最高的运动员谁是2021年收入最高的运动员?体育运动的财务数字是巨大的。世界上收入最高的运动员每年收入数千万,甚至数亿。全球大流行对许多运动的商业方面造成了重大影响。尽管在此期间球队及其所有者