Files
lserp_cs_6.0/插件库/Lskj.Control/Model/StaticBandedControl.cs
T

272 lines
11 KiB
C#

using DevExpress.XtraGrid.Views.BandedGrid;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraTab;
using Lskj.Control.ZKFinger;
using Lskj.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WinFormsControl = System.Windows.Forms.Control;
namespace Lskj.Control.Model
{
public static class StaticBandedControl
{
public static void ReleaseModuleReferences(WinFormsControl moduleRoot, XtraTabPage modulePage, string moduleCode)
{
List<WinFormsControl> moduleControls = CollectModuleControls(moduleRoot, modulePage);
ReleaseModuleReferences(moduleControls, modulePage, moduleCode);
}
internal static void ReleaseModuleReferences(
IEnumerable<WinFormsControl> moduleControls,
XtraTabPage modulePage,
string moduleCode)
{
try
{
List<WinFormsControl> controls = new List<WinFormsControl>();
if (moduleControls != null)
foreach (WinFormsControl control in moduleControls)
if (control != null && !ContainsControl(controls, control))
controls.Add(control);
List<BandedGridView> bandedViews = CollectBandedGridViews(controls);
List<GridView> targetViews = CollectTargetGridViews(controls);
foreach (BandedGridView view in bandedViews)
BandedGridDragGrid.DisposeRegistrations(
BandedGridViewDragGridDic,
BandedTargetViewDragGridDic,
view,
null);
foreach (GridView view in targetViews)
BandedGridDragGrid.DisposeRegistrations(
BandedGridViewDragGridDic,
BandedTargetViewDragGridDic,
null,
view);
if (ContainsBandedGridView(bandedViews, SourceDragBandedGridView))
SourceDragBandedGridView = null;
RemoveConditionPanels(moduleCode, controls);
RemoveProtectedReferences(controls, modulePage);
}
catch (Exception exception)
{
System.Diagnostics.Debug.WriteLine("释放旧 Banded 模块引用失败:" + exception);
}
}
private static List<WinFormsControl> CollectModuleControls(
WinFormsControl moduleRoot,
XtraTabPage modulePage)
{
List<WinFormsControl> result = new List<WinFormsControl>();
AddModuleControls(result, moduleRoot);
if (!ReferenceEquals(moduleRoot, modulePage))
AddModuleControls(result, modulePage);
return result;
}
private static void AddModuleControls(
List<WinFormsControl> target,
WinFormsControl root)
{
if (root == null)
return;
foreach (WinFormsControl control in EnumerateControls(root))
if (!ContainsControl(target, control))
target.Add(control);
}
private static List<BandedGridView> CollectBandedGridViews(
IEnumerable<WinFormsControl> controls)
{
List<BandedGridView> result = new List<BandedGridView>();
if (controls == null)
return result;
foreach (WinFormsControl control in controls)
{
DevExpress.XtraGrid.GridControl grid = control as DevExpress.XtraGrid.GridControl;
if (grid == null)
continue;
try
{
AddBandedGridView(result, grid.MainView as BandedGridView);
foreach (DevExpress.XtraGrid.Views.Base.BaseView baseView in grid.ViewCollection)
AddBandedGridView(result, baseView as BandedGridView);
}
catch (Exception exception)
{
System.Diagnostics.Debug.WriteLine("读取旧 Banded 表格视图失败:" + exception);
}
}
return result;
}
private static void AddBandedGridView(
List<BandedGridView> target,
BandedGridView view)
{
if (view != null && !ContainsBandedGridView(target, view))
target.Add(view);
}
private static bool ContainsBandedGridView(
IEnumerable<BandedGridView> gridViews,
BandedGridView value)
{
if (gridViews == null || value == null)
return false;
foreach (BandedGridView gridView in gridViews)
if (ReferenceEquals(gridView, value))
return true;
return false;
}
private static List<GridView> CollectTargetGridViews(
IEnumerable<WinFormsControl> controls)
{
List<GridView> result = new List<GridView>();
if (controls == null)
return result;
foreach (WinFormsControl control in controls)
{
DevExpress.XtraGrid.GridControl grid = control as DevExpress.XtraGrid.GridControl;
if (grid == null)
continue;
try
{
AddGridView(result, grid.MainView as GridView);
foreach (DevExpress.XtraGrid.Views.Base.BaseView baseView in grid.ViewCollection)
AddGridView(result, baseView as GridView);
}
catch (Exception exception)
{
System.Diagnostics.Debug.WriteLine("读取旧 Banded 目标表格视图失败:" + exception);
}
}
return result;
}
private static void AddGridView(List<GridView> target, GridView view)
{
if (view != null && !ContainsGridView(target, view))
target.Add(view);
}
private static bool ContainsGridView(
IEnumerable<GridView> gridViews,
GridView value)
{
if (gridViews == null || value == null)
return false;
foreach (GridView gridView in gridViews)
if (ReferenceEquals(gridView, value))
return true;
return false;
}
private static IEnumerable<WinFormsControl> EnumerateControls(WinFormsControl root)
{
yield return root;
foreach (WinFormsControl child in root.Controls)
foreach (WinFormsControl nested in EnumerateControls(child))
yield return nested;
}
private static void RemoveConditionPanels(
string moduleCode,
IEnumerable<WinFormsControl> moduleControls)
{
foreach (string key in ConditionsPanelDic.Keys.ToList())
{
ModuleConditionsPanelEx panel;
if (!ConditionsPanelDic.TryGetValue(key, out panel) || panel == null || panel.IsDisposed)
{
ConditionsPanelDic.Remove(key);
continue;
}
if (string.Equals(key, moduleCode, StringComparison.OrdinalIgnoreCase) &&
IsConditionPanelOwnedByModule(panel, moduleControls))
ConditionsPanelDic.Remove(key);
}
}
private static bool IsConditionPanelOwnedByModule(
ModuleConditionsPanelEx panel,
IEnumerable<WinFormsControl> moduleControls)
{
if (panel == null)
return false;
if (ContainsControl(moduleControls, panel) || ContainsControl(moduleControls, panel.Owner))
return true;
MyControl parentControl = panel.ParentControlObj;
return parentControl != null &&
parentControl.MainGridEx != null &&
ContainsControl(moduleControls, parentControl.MainGridEx);
}
private static void RemoveProtectedReferences(
IEnumerable<WinFormsControl> moduleControls,
XtraTabPage modulePage)
{
while (modulePage != null && DogVerifyModuleForms.Remove(modulePage))
{
}
foreach (XtraTabPage item in DogVerifyModuleForms.ToList())
if (item == null || item.IsDisposed || ContainsControl(moduleControls, item))
DogVerifyModuleForms.Remove(item);
foreach (IForm item in DogVerifyNoPageForms.ToList())
if (item == null || item.SubForm == null || item.SubForm.IsDisposed ||
ContainsControl(moduleControls, item.SubForm))
DogVerifyNoPageForms.Remove(item);
}
private static bool ContainsControl(
IEnumerable<WinFormsControl> moduleControls,
WinFormsControl value)
{
if (moduleControls == null || value == null)
return false;
foreach (WinFormsControl control in moduleControls)
if (ReferenceEquals(control, value))
return true;
return false;
}
/// <summary>
/// 记录当前U盾权限窗口
/// </summary>
public static List<XtraTabPage> DogVerifyModuleForms = new List<XtraTabPage>();
public static List<IForm> DogVerifyNoPageForms = new List<IForm>();
/// <summary>
///模块打开时的条件界面
/// </summary>
public static Dictionary<string, ModuleConditionsPanelEx> ConditionsPanelDic = new Dictionary<string, ModuleConditionsPanelEx>();
/// <summary>
/// 表格拖拽类,key值为源表,多表格
/// </summary>
public static Dictionary<BandedGridView, List<BandedGridDragGrid>> BandedGridViewDragGridDic = new Dictionary<BandedGridView, List<BandedGridDragGrid>>();
/// <summary>
/// 表格拖拽类,key值为目标表
/// </summary>
public static Dictionary<GridView, List<BandedGridDragGrid>> BandedTargetViewDragGridDic = new Dictionary<GridView, List<BandedGridDragGrid>>();
/// <summary>
/// 当前拖拽源表格
/// </summary>
public static BandedGridView SourceDragBandedGridView;
/// <summary>
/// 指纹识别模块
/// </summary>
public static FingerHelper fingerHelper;
/// <summary>
/// 进度条
/// </summary>
public static FrmProgressBar frmProgressBar;
}
}