
完整代码一次性补齐改动清单:PipeCheckUserControl:增加【执行质检】按钮;实现分组勾选联动子节点(勾选组自动全选/取消子检查项,勾选全部子项自动勾选父组)QCItemConfigForm:完整实现BuildCommonArea(实时读取ZwCAD图层、图层多选、排除图层、实体类型多选)QCItemConfigForm:完整实现BuildDynamicParamArea动态控件渲染 +CollectControlValue回写字典全部补空,窗体打开就有完整配置界面,兼容.NET4.7 + ZwCAD .NET API保持原有变量、命名风格,和你现有代码无缝对接图层控件使用CheckedListBox;实体类型固定选项(LINE、LWPOLYLINE、CIRCLE、ARC、INSERT)1. 更新 PipeCheckUserControl.cs(增加执行质检按钮 + 分组勾选联动)using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using CommBaseDB.QCConfig; namespace PipeQC.UI { public partial class PipeCheckUserControl : UserControl { private TreeView _treeQC; private ContextMenuStrip _treeContextMenu; private Button _btnRunQC; public PipeCheckUserControl() { this.SuspendLayout(); this.Size = new Size(310, 480); // 主容器,上面放按钮,下面放TreeView TableLayoutPanel tableMain = new TableLayoutPanel(); tableMain.Dock = DockStyle.Fill; tableMain.RowCount = 2; tableMain.RowStyles.Add(new RowStyle(SizeType.Absolute, 36)); tableMain.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); //执行质检按钮 _btnRunQC = new Button(); _btnRunQC.Text = "执行质检"; _btnRunQC.Dock = DockStyle.Fill; _btnRunQC.Click += BtnRunQC_Click; tableMain.Controls.Add(_btnRunQC, 0, 0); //TreeView _treeQC = new TreeView(); _treeQC.Dock = DockStyle.Fill; _treeQC.CheckBoxes = true; _treeQC.ShowLines = true; _treeQC.ShowPlusMinus = true; //右键菜单 _treeContextMenu = new ContextMenuStrip(); var menuConfig = new ToolStripMenuItem("参数配置"); menuConfig.Click += MenuConfig_Click; var menuReset = new ToolStripMenuItem("重置为默认参数"); menuReset.Click += MenuResetDefault_Click; _treeContextMenu.Items.Add(menuConfig); _treeContextMenu.Items.Add(menuReset); _treeQC.ContextMenuStrip = _treeContextMenu; _treeQC.NodeMouseClick += TreeQC_NodeMouseClick; _treeQC.AfterCheck += TreeQC_AfterCheck; tableMain.Controls.Add(_treeQC, 0, 1); this.Controls.Add(tableMain); this.ResumeLayout(false); //加载树数据 LoadCheckTree(); } //加载树,分组 private void LoadCheckTree() { _treeQC.Nodes.Clear(); var metaList = QCConfigDB.Instance.GetAllMeta(); var groups = metaList.GroupBy(m = m.GroupName).ToList(); foreach (var g in groups) { TreeNode groupNode = new TreeNode(g.Key); groupNode.Tag = "GROUP"; foreach (var itemMeta in g) { var userCfg = QCConfigDB.Instance.GetUserConfig(itemMeta.CheckItemId); TreeNode itemNode = new TreeNode(itemMeta.ItemShowName); itemNode.Tag = itemMeta; itemNode.Checked = userCfg.IsEnable; groupNode.Nodes.Add(itemNode); } _treeQC.Nodes.Add(groupNode); groupNode.Expand(); //初始化父节点勾选状态(子全部勾选则父勾选) SyncGroupNodeCheck(groupNode); } } //区分点击分组/检查项,右键仅检查项弹出配置 private void TreeQC_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button != MouseButtons.Right) return; if (e.Node.Tag is QCItemMeta) _treeQC.SelectedNode = e.Node; else e.Node.ContextMenuStrip = null; } //复选框勾选,【分组联动逻辑】 private void TreeQC_AfterCheck(object sender, TreeViewEventArgs e) { //关闭递归触发 _treeQC.AfterCheck -= TreeQC_AfterCheck; try { if (e.Node.Tag is string tag tag == "GROUP") { //点击分组节点:同步所有子项勾选状态 foreach (TreeNode child in e.Node.Nodes) { child.Checked = e.Node.Checked; QCItemMeta meta = child.Tag as QCItemMeta; if (meta != null) { var userCfg = QCConfigDB.Instance.GetUserConfig(meta.CheckItemId); userCfg.IsEnable = child.Checked; QCConfigDB.Instance.SaveUserConfig(userCfg); } } } else if (e.Node.Tag is QCItemMeta) { //点击子检查项:保存状态,同步父分组勾选 QCItemMeta meta = e.Node.Tag as QCItemMeta; var userCfg = QCConfigDB.Instance.GetUserConfig(meta.CheckItemId); userCfg.IsEnable = e.Node.Checked; QCConfigDB.Instance.SaveUserConfig(userCfg); //同步父节点状态 SyncGroupNodeCheck(e.Nod