
优化后的完整 QCItemConfigForm.cs四个改动点全部处理:自适应缩放:主容器TableLayoutPanel全部Dock=Fill,行高用百分比分配,CheckedListBox 在各自面板里Dock=Fill,窗口拉大控件跟着大去掉排除图层:公共区只剩「检查图层」+「实体类型」两块图层控件占比加大:公共区高度从140提到200,图层CheckedListBox高度120全选/反选 + 显示上次配置:图层区加「全选」「反选」两个小按钮把上次保存的图层名合并进当前DWG图层列表(DWG里没有的也显示出来,用红色字标记),这样上次选了什么一目了然using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using Newtonsoft.Json; using ZwSoft.ZwCAD.DatabaseServices; using ZwSoft.ZwCAD.ApplicationServices; namespace PipeQC.UI { public partial class QCItemConfigForm : Form { private QCItemMeta _meta; private QCUserConfig _oldUserCfg; private Dictionarystring, object _userParamDict; public QCUserConfig ResultUserConfig { get; private set; } //公共区控件 private CheckedListBox _chkLayers; private CheckedListBox _chkEntityTypes; //记录哪些图层名来自上次配置但当前DWG不存在,用于红色显示 private HashSetstring _layersNotInDwg = new HashSetstring(); //动态控件缓存 private Dictionarystring, Control _dynamicControlMap = new Dictionarystring, Control(); public QCItemConfigForm(QCItemMeta meta, QCUserConfig userCfg) { _meta = meta; _oldUserCfg = userCfg; this.Text = $"{meta.ItemShowName} 参数配置"; this.Size = new System.Drawing.Size(520, 560); this.MinimumSize = new System.Drawing.Size(480, 480); this.StartPosition = FormStartPosition.CenterParent; _userParamDict = JsonConvert.DeserializeObjectDictionarystring, object(userCfg.UserParamJson); // ========== 主容器:TableLayoutPanel,Dock=Fill,自适应 ========== var mainPanel = new TableLayoutPanel(); mainPanel.Dock = DockStyle.Fill; mainPanel.RowCount = 3; mainPanel.ColumnCount = 1; // 第0行:公共区(图层+实体类型),占60% // 第1行:动态业务参数区,占40% // 第2行:底部按钮,固定45 mainPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 60F)); mainPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 40F)); mainPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 45F)); mainPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); this.Controls.Add(mainPanel); // ---------- 公共区 ---------- var panelCommon = new Panel(); panelCommon.Dock = DockStyle.Fill; BuildCommonArea(panelCommon); mainPanel.Controls.Add(panelCommon, 0, 0); // ---------- 动态参数区 ---------- var panelDynamic = new Panel(); panelDynamic.Dock = DockStyle.Fill; var flpDynamic = new FlowLayoutPanel(); flpDynamic.Dock = DockStyle.Fill; flpDynamic.FlowDirection = FlowDirection.TopDown; flpDynamic.WrapContents = false; flpDynamic.AutoScroll = true; BuildDynamicParamArea(flpDynamic); panelDynamic.Controls.Add(flpDynamic); mainPanel.Controls.Add(panelDynamic, 0, 1); // ---------- 底部按钮 ---------- var btnPanel = new FlowLayoutPanel(); btnPanel.Dock = DockStyle.Fill; btnPanel.FlowDirection = FlowDirection.RightToLeft; btnPanel.Padding = new Padding(0, 6, 8, 0); var btnSave = new Button() { Text = "保存", Width = 90, Height = 28 }; var btnReset = new Button() { Text = "重置默认", Width = 90, Height = 28 }; var btnCancel = new Button() { Text = "取消", Width = 90, Height = 28 }; btnSave.Click += (s, e) = { CollectControlValue(); this.DialogResult = DialogResult.OK; ResultUserConfig = _oldUserCfg; ResultUserConfig.UserParamJson = JsonConvert.SerializeObject(_userParamDict, Newtonsoft.Json.Formatting.Indented); this.Close(); }; btnReset.Click += (s, e) = { //重置为元数据默认JSON _userParamDict = JsonConvert.DeserializeObjectDictionarystring, object(_meta.DefaultJson); //重建整个界面 mainPanel.Controls.Clear(); panelCommon.Controls.Clear(); BuildCommonArea(panelCommon); panelDynamic.Controls.Clear();