using AntdUI; using AntdUIDemo.Models; using AntdUIDemo.Views.Table; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Threading; using System.Windows.Forms; namespace AntdUIDemo.Views { public partial class TableDemo : UserControl { private AntdUI.Window window; AntList antList; User curUser; public TableDemo(AntdUI.Window _window) { window = _window; InitializeComponent(); //初始化表格列头 InitTableColumns(); InitData(); BindEventHandler(); } private void InitTableColumns() { table_base.Columns = new ColumnCollection() { new ColumnCheck("Selected"){Fixed = true}, new Column("Name", "姓名", ColumnAlign.Center) { Width="120", //设置树节点,名称需和User里的User[]名称保持一致 KeyTree = "Users" }, new Column("Age", "年龄",ColumnAlign.Center), new Column("Address", "地址"){ Width = "120", LineBreak = true, }, new ColumnSwitch("Enabled", "是否启用", ColumnAlign.Center){ //支持点击回调 Call= (value,record, i_row, i_col) =>{ //执行耗时操作 Thread.Sleep(1000); AntdUI.Message.info(window, value.ToString(),autoClose:1); return value; } }, new Column("CellImages", "图片",ColumnAlign.Center), new Column("CellTags", "标签",ColumnAlign.Center), new Column("CellBadge", "徽标",ColumnAlign.Center), new Column("CellText", "富文本") { ColAlign = ColumnAlign.Center,//支持表头位置单独设置 }, new Column("CellProgress", "进度条",ColumnAlign.Center), new Column("CellDivider", "分割线",ColumnAlign.Center), new Column("CellLinks", "链接", ColumnAlign.Center) { Fixed = true,//冻结列 }, }; } private void BindEventHandler() { buttonADD.Click += ButtonADD_Click; buttonDEL.Click += ButtonDEL_Click; checkbox_border.CheckedChanged += Checkbox_CheckedChanged; checkbox_columndragsort.CheckedChanged += Checkbox_CheckedChanged; checkbox_fixheader.CheckedChanged += Checkbox_CheckedChanged; checkbox_rowstyle.CheckedChanged += Checkbox_rowstyle_CheckedChanged; checkbox_sort.CheckedChanged += Checkbox_CheckedChanged; checkbox_visibleheader.CheckedChanged += Checkbox_CheckedChanged; table_base.CellClick += Table_base_CellClick; table_base.CellButtonClick += Table_base_CellButtonClick; } private void Checkbox_rowstyle_CheckedChanged(object sender, BoolEventArgs e) { if (e.Value) { table_base.SetRowStyle += Table_base_SetRowStyle; table_base.Invalidate(); } else { table_base.SetRowStyle -= Table_base_SetRowStyle; table_base.Invalidate(); } } private void Checkbox_CheckedChanged(object sender, BoolEventArgs e) { table_base.Bordered = checkbox_border.Checked; table_base.ColumnDragSort = checkbox_columndragsort.Checked; table_base.FixedHeader = checkbox_fixheader.Checked; table_base.VisibleHeader = checkbox_visibleheader.Checked; foreach (var item in table_base.Columns) { item.SortOrder = checkbox_sort.Checked; } } private AntdUI.Table.CellStyleInfo Table_base_SetRowStyle(object sender, TableSetRowStyleEventArgs e) { if (e.RowIndex % 2 == 0) { return new AntdUI.Table.CellStyleInfo { BackColor = AntdUI.Style.Db.ErrorBg, }; } return null; } private void ButtonADD_Click(object sender, EventArgs e) { User useradd = new User() { CellBadge = new CellBadge(TState.Processing, "测试中"), CellImages = new CellImage[] { new CellImage(Properties.Resources.head) }, CellDivider = new CellDivider(), CellTags = new CellTag[] { new CellTag("测试", TTypeMini.Primary), new CellTag("测试", TTypeMini.Success), new CellTag("测试", TTypeMini.Warn) }, CellText = new CellText("这是一个无图标的文本"), CellProgress = new CellProgress(0.5f), CellLinks = new CellLink[]{ new CellLink("https://gitee.com/antdui/AntdUI", "AntdUI"), new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error) }, }; var form = new UserEdit(window, useradd) { Size = new Size(700, 400) }; AntdUI.Modal.open(new AntdUI.Modal.Config(window, "", form, TType.None) { BtnHeight = 0, }); if (form.submit) { antList.Add(useradd); } } private void Table_base_CellClick(object sender, TableClickEventArgs e) { var record = e.Record; if (record is User user) { curUser = user; //判断是否右键 if (e.Button == MouseButtons.Right) { if (antList.Count == 0) return; AntdUI.ContextMenuStrip.open(new AntdUI.ContextMenuStrip.Config(table_base, (item) => { if (item.Text == "开启") { user.Enabled = true; } else if (item.Text == "关闭") { user.Enabled = false; } else if (item.Text == "编辑") { var form = new UserEdit(window, user) { Size = new Size(500, 300) }; AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) { OnLoad = () => { AntdUI.Message.info(window, "进入编辑", autoClose: 1); }, OnClose = () => { AntdUI.Message.info(window, "结束编辑", autoClose: 1); } }); } else if (item.Text == "删除") { var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) { //父元素没有勾选或者子元素也没有勾选,则删除当前行 bool delCurrent = !antList.Any(x => x.Selected || (x.Users?.Any(u => u.Selected) ?? false)); if (delCurrent) { //删除当前行,先判断是否父元素,再判断是否子元素,只支持一层子元素,需实现嵌套查询 for (int i = 0; i < antList.Count; i++) { if (antList[i] == user) { antList.RemoveAt(i); } else { antList[i].Users = antList[i].Users?.Where(x => x != user).ToArray(); } } } else { // 使用反转for循环删除主列表中选中的项 for (int i = antList.Count - 1; i >= 0; i--) { // 1.删除选中的主列表项 if (antList[i].Selected) { antList.RemoveAt(i); } else { // 删除子列表中选中的项 antList[i].Users = antList[i].Users?.Where(childUser => !childUser.Selected).ToArray(); } } } } } else if (item.Text == "查看图片") { //查看其他来源的高清图片 Preview.open(new Preview.Config(window, Properties.Resources.head2)); } else AntdUI.Message.info(window, item.Text, autoClose: 1); }, new IContextMenuStripItem[] { //根据行数据动态修改右键菜单 user.Enabled? new ContextMenuStripItem("关闭") { IconSvg = "CloseOutlined" }:new ContextMenuStripItem("开启") { IconSvg = "CheckOutlined" }, new AntdUI.ContextMenuStripItem("编辑"){ IconSvg = "EditOutlined", }, new AntdUI.ContextMenuStripItem("删除"){ IconSvg = "DeleteOutlined" }, new ContextMenuStripItem("查看图片") { IconSvg = "FundViewOutlined" }, new ContextMenuStripItemDivider(), new AntdUI.ContextMenuStripItem("详情"){ Sub = new IContextMenuStripItem[]{ new AntdUI.ContextMenuStripItem("打印", "Ctrl + P") { }, new AntdUI.ContextMenuStripItem("另存为", "Ctrl + S") { } }, IconSvg = "", } })); } else { } } } //表格内部按钮事件 private void Table_base_CellButtonClick(object sender, TableButtonEventArgs e) { var buttontext = e.Btn.Text; if (e.Record is User user) { curUser = user; switch (buttontext) { //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 case "编辑": var form = new UserEdit(window, user) { Size = new Size(500, 300) }; AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) { OnLoad = () => { AntdUI.Message.info(window, "进入编辑", autoClose: 1); }, OnClose = () => { AntdUI.Message.info(window, "结束编辑", autoClose: 1); } }); break; case "删除": var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) antList.Remove(user); break; case "AntdUI": //超链接内容 AntdUI.Message.info(window, user.CellLinks.FirstOrDefault().Id, autoClose: 1); break; case "查看图片": //使用clone可以防止table中的image被修改 Preview.open(new Preview.Config(window, (Image)curUser.CellImages[0].Image.Clone())); break; } } } private void ButtonDEL_Click(object sender, EventArgs e) { if (antList.Count == 0 || !antList.Any(x => x.Selected)) { bool isSubSelected = false; // 判断子元素是否勾选 for (int i = 0; i < antList.Count; i++) { if (antList[i].Users != null && antList[i].Users.Any(x => x.Selected)) { isSubSelected = true; break; } } if (!isSubSelected) { AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); return; } } var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) { // 使用反转for循环删除主列表中选中的项 for (int i = antList.Count - 1; i >= 0; i--) { // 删除选中的主列表项 if (antList[i].Selected) { antList.RemoveAt(i); } else { // 删除子列表中选中的项 antList[i].Users = antList[i].Users?.Where(user => !user.Selected).ToArray(); } } // 提示删除完成 AntdUI.Message.success(window, "删除成功!", autoClose: 3); } } private void InitData() { antList = new AntList(); for (int i = 0; i < 10; i++) { antList.Add(new User { Name = "张三", Age = 30 + i, Address = $"浙江省杭州市西湖区湖底公园{i + 1}号", Enabled = i % 2 == 0, CellImages = new CellImage[] { new CellImage(Properties.Resources.head) }, CellTags = new CellTag[] { new CellTag("测试", TTypeMini.Primary), new CellTag("测试", TTypeMini.Success), new CellTag("测试", TTypeMini.Warn) }, CellBadge = new CellBadge(TState.Processing, "测试中"), CellText = new CellText("这是一个带图标的文本") { IconRatio = 0.5f, PrefixSvg = "" }, CellLinks = new CellLink[] {new CellLink("https://gitee.com/antdui/AntdUI", "AntdUI"), new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), new CellButton(Guid.NewGuid().ToString(), "徽标", TTypeMini.Success) { //支持所有单元格控件 DropDownItems = new ISelectItem[] { new AntdUI.SelectItem(TState.Default), new AntdUI.SelectItem(TState.Primary), new AntdUI.SelectItem(TState.Success), new AntdUI.SelectItem(TState.Error), new AntdUI.SelectItem(TState.Warn), new AntdUI.SelectItem(TState.Processing), }, DropDownValueChanged = (value) => { string badge = value.ToString(); switch(badge) { case "Default": curUser.CellBadge = new CellBadge(TState.Default, badge); break; case "Primary": curUser.CellBadge = new CellBadge(TState.Primary, badge); break; case "Success": curUser.CellBadge = new CellBadge(TState.Success, badge); break; case "Error": curUser.CellBadge = new CellBadge(TState.Error, badge); break; case "Warn": curUser.CellBadge = new CellBadge(TState.Warn, badge); break; case "Processing": curUser.CellBadge = new CellBadge(TState.Processing, badge); break; } } }, new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error), new CellButton(Guid.NewGuid().ToString(),"查看图片",TTypeMini.Primary)}, //value:0-1 CellProgress = new CellProgress(0.5f), CellDivider = new CellDivider(), }); } List subUsers = new List(); for (int i = 0; i < 3; i++) { subUsers.Add(new User() { Name = "李四", Age = 30 + i, Address = $"上海市东方明珠{i + 1}号", Enabled = i % 2 == 0, CellImages = new CellImage[] { new CellImage(Properties.Resources.head) }, CellTags = new CellTag[] { new CellTag("测试", TTypeMini.Primary) }, CellBadge = new CellBadge(TState.Success, "已完成"), CellText = new CellText("这是一个带图标的文本") { IconRatio = 0.5f, PrefixSvg = "" }, CellLinks = new CellLink[] { new CellLink("https://gitee.com/antdui/AntdUI", "AntdUI") }, //value:0-1 CellProgress = new CellProgress(1f), CellDivider = new CellDivider(), }); } //设置树数据,可为任意行设置 antList[1].Users = subUsers.ToArray(); table_base.Binding(antList); //设置行禁用 table_base.SetRowEnable(0, false, true); } } }