// 旧版双 TabControl 布局的兼容层。 // 旧项目主窗口结构:tabControl1(顶部 项目/报价/设置) + tabControl2(左 项目/报价/选型) + tabControl3(右 元件库/用户库/...)。 // 新项目改为停靠面板后,旧逻辑里的 tabControl2/tabPageN 引用通过本文件映射到停靠窗口。 using System; using WeifenLuo.WinFormsUI.Docking; namespace 成套报价软件 { public partial class MainForm { private 旧选项卡兼容 _tabControl2兼容; /// 旧 tabControl2 → 停靠面板当前活动文档。 internal 旧选项卡兼容 tabControl2 { get { if (_tabControl2兼容 == null) { _tabControl2兼容 = new 旧选项卡兼容(delegate { return this.dockSurface1.ActiveContent as DockContent; }); } return _tabControl2兼容; } } // ---- 旧页签名 → 新控件别名(旧代码 this.tabPageN 继续可用)---- /// 旧左侧"项目"页 → 停靠窗口"项目"。 public DockContent tabPage3 { get { return this.w1; } } /// 旧左侧"报价"页 → 停靠窗口"报价"。 public DockContent tabPage4 { get { return this.w2; } } /// 旧左侧"选型"页 → 停靠窗口"选型"。 public DockContent tabPage10 { get { return this.w3; } } /// 旧右侧"元件库"页 → 停靠窗口"元件库"。 public DockContent tabPage5 { get { return this.w4; } } /// 旧右侧"用户库"页 → 停靠窗口"用户库"。 public DockContent tabPage6 { get { return this.w5; } } /// 旧右侧"柜体库"页 → 停靠窗口"柜体库"。 public DockContent tabPage11 { get { return this.w6; } } /// 旧右侧"母排"页 → 停靠窗口"母排"。 public DockContent tabPage12 { get { return this.w7; } } /// 旧右侧"方案"页 → 停靠窗口"方案"。 public DockContent tabPage13 { get { return this.w8; } } /// 旧右侧"箱体计算"页 → 停靠窗口"箱体计算"。 public DockContent tabPage14 { get { return this.w9; } } } /// /// 旧 TabControl 的兼容壳: /// SelectedTab → 停靠面板当前活动停靠窗口(读),激活该窗口(写); /// SelectedIndexChanged → 由 dockSurface1.ActiveContentChanged 触发(见 MainForm.DockSurface1ActiveContentChanged)。 /// internal class 旧选项卡兼容 { private readonly Func _active; private DockContent _lastSeen; public 旧选项卡兼容(Func active) { _active = active; } /// 当前活动停靠窗口;无活动文档时为 null。赋值 = 激活对应停靠窗口。 public DockContent SelectedTab { get { return _active(); } set { var d = value; if (d != null) { d.Show(); d.Activate(); } } } /// 本次事件触发之前的活动停靠窗口(识别"从哪页切过来";null=未知/首次触发)。 public DockContent PreviousSelectedTab { get; private set; } /// 最近一次真实活动的停靠窗口(不会被单元格编辑导致的 null 闪断清空)。 public DockContent 最后活动窗口 { get { return _lastSeen; } } public event EventHandler SelectedIndexChanged; internal void RaiseSelectedIndexChanged() { // ★ 停靠版关键防护:点击单元格时焦点进入编辑控件,ActiveContent 会 // 瞬时闪断成 null 再跳回原窗口。这不是页签切换,必须忽略—— // 否则会触发全量保存+重算,表格刷新导致选中乱跑、刚插入的行被冲掉。 var cur = _active(); if (cur == null) return; // 焦点瞬时离开停靠面板(单元格编辑/浮动工具窗) if (cur == _lastSeen) return; // 活动窗口没有真正变化 // 先记录切换来源再广播,供订阅方判断"从哪页切到哪页" PreviousSelectedTab = _lastSeen; _lastSeen = cur; var h = SelectedIndexChanged; if (h != null) { h(this, EventArgs.Empty); } } } }