using AntdUI; using AntdUIDemo.Views.Table; using DH.Commons.Enums; using DH.Devices.Vision; using DHSoftware.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Common; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using DH.Devices.Vision; using DH.Commons.Base; namespace DHSoftware.Views { public partial class DetectConfigControl : UserControl { private DetectionConfig _currentConfig = new DetectionConfig(); private readonly string _configName; List<KeyValuePair<string, int>> MLModelTypes = GetFilteredEnumDescriptionsAndValues<ModelType>(); public static List<KeyValuePair<string, int>> GetFilteredEnumDescriptionsAndValues<T>() where T : Enum { return Enum.GetValues(typeof(T)) .Cast<T>() .Select(e => { // 获取枚举的 Description 属性,如果没有,则使用枚举的名称 var description = e.GetType() .GetField(e.ToString()) ?.GetCustomAttribute<DescriptionAttribute>() ?.Description ?? e.ToString(); // 返回枚举的描述和对应的整数值 return new KeyValuePair<string, int>(description, Convert.ToInt32(e)); }) .ToList(); } List<KeyValuePair<string, int>> resultStates = GetFilteredEnumDescriptionsAndValues<ResultState>(); // 获取枚举的描述和对应的值,只筛选出 OK 和 NG public static List<KeyValuePair<string, int>> GetFilteredEnumDescriptionsAndValuesres<T>() where T : Enum { return Enum.GetValues(typeof(T)) .Cast<T>() .Where(e => e.Equals(ResultState.OK) || e.Equals(ResultState.DetectNG)) // 只保留 OK 和 NG .Select(e => { // 通过反射获取 DescriptionAttribute 描述,如果没有描述,则使用枚举项名称 var description = e.GetType() .GetField(e.ToString()) ?.GetCustomAttribute<DescriptionAttribute>() ?.Description ?? e.ToString(); // 如果没有 DescriptionAttribute,则使用枚举名称 // 返回描述和值的键值对 return new KeyValuePair<string, int>(description, Convert.ToInt32(e)); }) .ToList(); } DetectionConfig Detection = new DetectionConfig(); AntList<DefectRow> antList; public AntdUI.Window _window; DefectRow curUser; public DetectConfigControl() { InitializeComponent(); InitTableColumns(); //InitData(); BindEventHandler(); foreach (var item in MLModelTypes) { cbxDetectType.Items.Add(item.Key); } cbxDetectType.SelectedIndex = (int)Detection.ModelType - 1; tbDetectName.Text = Detection.Name; } private void InitTableColumns() { table_base.Columns = new ColumnCollection() { new ColumnCheck("Selected"){Fixed = true}, new Column("LabelDescription", "标签名", ColumnAlign.Center) { Width="120", //设置树节点,名称需和User里的User[]名称保持一致 KeyTree = "Users" }, new ColumnSwitch("IsEnable", "是否启用", ColumnAlign.Center){ //支持点击回调 //Call= (value,record, i_row, i_col) =>{ // //执行耗时操作 // Thread.Sleep(10); // // AntdUI.Message.info(window, value.ToString(),autoClose:1); // return value; //} }, new Column("ScoreMinValue", "最小得分",ColumnAlign.Center), new Column("ScoreMaxValue", "最大得分",ColumnAlign.Center), new Column("AreaMinValue", "最小面积",ColumnAlign.Center), new Column("AreaMaxValue", "最大面积",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 InitData() { antList = new AntList<DefectRow>(); for (int i = 0; i < 10; i++) { antList.Add(new DefectRow { LabelDescription = "张三", }); } table_base.Binding(antList); //设置行禁用 // table_base.SetRowEnable(0, false, true); } private void BindEventHandler() { buttonADD.Click += ButtonADD_Click; buttonDEL.Click += ButtonDEL_Click; table_base.CellClick += Table_base_CellClick; table_base.CellButtonClick += Table_base_CellButtonClick; } 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) { DefectRow useradd = new DefectRow() { LabelDescription="xinquexian", IsEnable=true, ScoreMinValue=0.3, ScoreMaxValue=1, AreaMinValue=1, AreaMaxValue=999999999, }; var form = new DefectRowEdit(_window, useradd) { Size = new Size(700, 500) }; 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 DefectRow 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.IsEnable = true; } else if (item.Text == "关闭") { user.IsEnable = false; } else if (item.Text == "编辑") { var form = new DefectRowEdit(_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.?.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.IsEnable? 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 = "<svg t=\"1725101601993\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1414\" width=\"200\" height=\"200\"><path d=\"M450.23 831.7c-164.87 0-316.85-108.51-366.94-269.68-30.4-97.82-20.9-201.62 26.76-292.29s127.79-157.35 225.6-187.75c97.83-30.42 201.61-20.9 292.29 26.76 90.67 47.67 157.35 127.79 187.75 225.61 35.78 115.12 16.24 237.58-53.6 335.99a383.494 383.494 0 0 1-43 50.66c-15.04 14.89-39.34 14.78-54.23-0.29-14.9-15.05-14.77-39.34 0.29-54.23a307.844 307.844 0 0 0 34.39-40.52c55.9-78.76 71.54-176.75 42.92-268.84-50.21-161.54-222.49-252.1-384.03-201.9-78.26 24.32-142.35 77.67-180.48 150.2-38.14 72.53-45.74 155.57-21.42 233.83 44.58 143.44 190.03 234.7 338.26 212.42 20.98-3.14 40.48 11.26 43.64 32.2 3.16 20.95-11.26 40.48-32.2 43.64a377.753 377.753 0 0 1-56 4.19z\" p-id=\"1415\"></path><path d=\"M919.84 959.5c-9.81 0-19.63-3.74-27.11-11.24L666.75 722.29c-14.98-14.97-14.98-39.25 0-54.23 14.97-14.98 39.26-14.98 54.23 0l225.97 225.97c14.98 14.97 14.98 39.25 0 54.23-7.48 7.5-17.3 11.24-27.11 11.24z\" p-id=\"1416\"></path></svg>", } })); } else { } } } //表格内部按钮事件 private void Table_base_CellButtonClick(object sender, TableButtonEventArgs e) { var buttontext = e.Btn.Text; if (e.Record is DefectRow user) { curUser = user; switch (buttontext) { //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 case "编辑": var form = new DefectRowEdit(_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(this.w, "删除成功!", autoClose: 3); MessageBox.Show("删除成功!"); } } } }