C2021-059_deleteFolders #379

Merged
jjenko merged 6 commits from C2021-059_deleteFolders into Development 2024-08-02 14:05:25 -04:00
8 changed files with 484 additions and 186 deletions

View File

@ -23519,6 +23519,90 @@ GO
========================================================================================================== ==========================================================================================================
*/ */
/*
==========================================================================================================
Start: C2021-059: SQL to delete folders using admin tool
==========================================================================================================
*/
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'deleteFolderAdmin')
DROP PROCEDURE [dbo].[deleteFolderAdmin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*****************************************************************************
Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
Copyright 2012 - Volian Enterprises, Inc. All rights reserved.
*****************************************************************************/
CREATE PROCEDURE [dbo].[deleteFolderAdmin]
(
@FolderID int
)
WITH EXECUTE AS OWNER
AS
BEGIN TRY -- Try Block
BEGIN TRANSACTION
DELETE From Assignments WHERE [FolderID]=@FolderID
DELETE From Associations where VersionID in (select versionid from DocVersions where folderid = @FolderID)
DELETE From DocVersions where VersionID in (select versionid from DocVersions where folderid= @FolderID)
DELETE From DocVersions where [FolderID]=@FolderID
-- Delete from items where ItemID matches
DELETE FROM tblitems
WHERE ItemID IN (
SELECT DISTINCT ItemID
FROM docversions
WHERE folderID = @folderID
);
-- Delete from items where ItemID matches
DELETE FROM tblitems
WHERE ItemID IN (
SELECT DISTINCT ItemID
FROM docversions
WHERE folderID = @folderID
);
-- Delete from tblContents where ContentID matches
DELETE FROM tblContents
WHERE ContentID IN (
SELECT DISTINCT c.ContentID
FROM tblContents c
JOIN items i ON c.ContentID = i.ItemID
WHERE i.ItemID IN (
SELECT DISTINCT ItemID
FROM docversions
WHERE folderID = @folderID
)
);
DELETE From Folders WHERE [ParentID] = @FolderID
DELETE From Folders WHERE [FolderID] = @FolderID
IF( @@TRANCOUNT > 0 ) COMMIT
END TRY
BEGIN CATCH -- Catch Block
IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level
ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback
EXEC vlnErrorHandler
END CATCH
GO
/*
==========================================================================================================
End: C2021-059: SQL to delete folders using admin tool
==========================================================================================================
*/
/* /*
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
| ADD New Code Before this Block | | ADD New Code Before this Block |
@ -23552,8 +23636,8 @@ BEGIN TRY -- Try Block
DECLARE @RevDate varchar(255) DECLARE @RevDate varchar(255)
DECLARE @RevDescription varchar(255) DECLARE @RevDescription varchar(255)
set @RevDate = '07/18/2024 11:24' set @RevDate = '07/29/2024 11:24'
set @RevDescription = 'C2024-005 Add an Admin tool that can delete a group of annotations.' set @RevDescription = 'C2021-059 Add SQL for Admin tool delete folders.'
Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription
PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription

View File

@ -105,7 +105,6 @@
this.sideNavItmRepair = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmRepair = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmLinks = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmLinks = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmUsers = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmUsers = new DevComponents.DotNetBar.Controls.SideNavItem();
this.buttonItem1 = new DevComponents.DotNetBar.ButtonItem();
this.sideNavItmDelete = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmDelete = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmExit = new DevComponents.DotNetBar.Controls.SideNavItem(); this.sideNavItmExit = new DevComponents.DotNetBar.Controls.SideNavItem();
this.panelEx4 = new DevComponents.DotNetBar.PanelEx(); this.panelEx4 = new DevComponents.DotNetBar.PanelEx();
@ -115,6 +114,7 @@
this.stepItem3 = new DevComponents.DotNetBar.StepItem(); this.stepItem3 = new DevComponents.DotNetBar.StepItem();
this.stepItem4 = new DevComponents.DotNetBar.StepItem(); this.stepItem4 = new DevComponents.DotNetBar.StepItem();
this.lblAdmToolProgressType = new DevComponents.DotNetBar.LabelX(); this.lblAdmToolProgressType = new DevComponents.DotNetBar.LabelX();
this.buttonItem1 = new DevComponents.DotNetBar.ButtonItem();
this.superTooltip1 = new DevComponents.DotNetBar.SuperTooltip(); this.superTooltip1 = new DevComponents.DotNetBar.SuperTooltip();
((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();
this.splitContainer3.Panel1.SuspendLayout(); this.splitContainer3.Panel1.SuspendLayout();
@ -137,9 +137,6 @@
// //
// myTV // myTV
// //
this.myTV.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.myTV.CheckBoxes = true; this.myTV.CheckBoxes = true;
this.myTV.Dock = System.Windows.Forms.DockStyle.Bottom; this.myTV.Dock = System.Windows.Forms.DockStyle.Bottom;
this.myTV.Location = new System.Drawing.Point(0, 184); this.myTV.Location = new System.Drawing.Point(0, 184);
@ -501,35 +498,10 @@
this.sideNavPanel4.Controls.Add(this.myTVdel); this.sideNavPanel4.Controls.Add(this.myTVdel);
this.sideNavPanel4.Controls.Add(this.btnDeleteItems); this.sideNavPanel4.Controls.Add(this.btnDeleteItems);
this.sideNavPanel4.Dock = System.Windows.Forms.DockStyle.Fill; this.sideNavPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel4.Location = new System.Drawing.Point(89, 31); this.sideNavPanel4.Location = new System.Drawing.Point(80, 31);
this.sideNavPanel4.Name = "sideNavPanel4"; this.sideNavPanel4.Name = "sideNavPanel4";
this.sideNavPanel4.Size = new System.Drawing.Size(291, 494); this.sideNavPanel4.Size = new System.Drawing.Size(300, 494);
this.sideNavPanel4.TabIndex = 27; this.sideNavPanel4.TabIndex = 27;
//
// sideNavPanel5
//
this.sideNavPanel5.Controls.Add(this.btn_ShowUsers);
this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel5.Location = new System.Drawing.Point(81, 31);
this.sideNavPanel5.Name = "sideNavPanel5";
this.sideNavPanel5.Size = new System.Drawing.Size(299, 494);
this.sideNavPanel5.TabIndex = 14;
this.sideNavPanel5.Visible = false;
//
// btn_ShowUsers
//
this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_ShowUsers.Checked = true;
this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37);
this.btn_ShowUsers.Name = "btn_ShowUsers";
this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23);
this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" +
"d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80)));
this.btn_ShowUsers.TabIndex = 0;
this.btn_ShowUsers.Text = "Show Users";
this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click);
// //
// swDeleteFolder // swDeleteFolder
// //
@ -544,7 +516,6 @@
this.superTooltip1.SetSuperTooltip(this.swDeleteFolder, new DevComponents.DotNetBar.SuperTooltipInfo("Check RO Links", "", resources.GetString("swDeleteFolder.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(250, 150))); this.superTooltip1.SetSuperTooltip(this.swDeleteFolder, new DevComponents.DotNetBar.SuperTooltipInfo("Check RO Links", "", resources.GetString("swDeleteFolder.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(250, 150)));
this.swDeleteFolder.SwitchClickTogglesValue = true; this.swDeleteFolder.SwitchClickTogglesValue = true;
this.swDeleteFolder.TabIndex = 39; this.swDeleteFolder.TabIndex = 39;
this.swDeleteFolder.Visible = false;
this.swDeleteFolder.ValueChanged += new System.EventHandler(this.swDeleteFolder_ValueChanged); this.swDeleteFolder.ValueChanged += new System.EventHandler(this.swDeleteFolder_ValueChanged);
// //
// labelX13 // labelX13
@ -561,7 +532,6 @@
this.superTooltip1.SetSuperTooltip(this.labelX13, new DevComponents.DotNetBar.SuperTooltipInfo("Check RO Links", "", resources.GetString("labelX13.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(350, 175))); this.superTooltip1.SetSuperTooltip(this.labelX13, new DevComponents.DotNetBar.SuperTooltipInfo("Check RO Links", "", resources.GetString("labelX13.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(350, 175)));
this.labelX13.TabIndex = 38; this.labelX13.TabIndex = 38;
this.labelX13.Text = "Delete Folders"; this.labelX13.Text = "Delete Folders";
this.labelX13.Visible = false;
// //
// swDeleteAnnotations // swDeleteAnnotations
// //
@ -597,15 +567,13 @@
// //
// myTVdel // myTVdel
// //
this.myTVdel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.myTVdel.CheckBoxes = true; this.myTVdel.CheckBoxes = true;
this.myTVdel.Dock = System.Windows.Forms.DockStyle.Bottom; this.myTVdel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.myTVdel.Location = new System.Drawing.Point(0, 127); this.myTVdel.Location = new System.Drawing.Point(0, 127);
this.myTVdel.Name = "myTVdel"; this.myTVdel.Name = "myTVdel";
this.myTVdel.Size = new System.Drawing.Size(291, 367); this.myTVdel.Size = new System.Drawing.Size(300, 367);
this.myTVdel.TabIndex = 34; this.myTVdel.TabIndex = 34;
this.myTVdel.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.myTV_AfterCheck_DelAnn);
// //
// btnDeleteItems // btnDeleteItems
// //
@ -616,11 +584,9 @@
this.btnDeleteItems.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground; this.btnDeleteItems.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnDeleteItems.Location = new System.Drawing.Point(39, 98); this.btnDeleteItems.Location = new System.Drawing.Point(39, 98);
this.btnDeleteItems.Name = "btnDeleteItems"; this.btnDeleteItems.Name = "btnDeleteItems";
this.btnDeleteItems.Size = new System.Drawing.Size(212, 23); this.btnDeleteItems.Size = new System.Drawing.Size(221, 23);
this.btnDeleteItems.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled; this.btnDeleteItems.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btnDeleteItems, new DevComponents.DotNetBar.SuperTooltipInfo("Process Deletions", "", "This will allow for the deletion of groups of annotations and allow for deleting entire folders within PROMS. Use the tree nodes to select which items to delete.\r\n\r\nClick on the on" + this.superTooltip1.SetSuperTooltip(this.btnDeleteItems, new DevComponents.DotNetBar.SuperTooltipInfo("Process Deletions", "", resources.GetString("btnDeleteItems.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 175)));
"/off switches to turn on/off each tool.\r\n\r\nNote that only one of these tools can" +
" be run at a time.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 175)));
this.btnDeleteItems.TabIndex = 35; this.btnDeleteItems.TabIndex = 35;
this.btnDeleteItems.Text = "Process Deletions"; this.btnDeleteItems.Text = "Process Deletions";
this.btnDeleteItems.Click += new System.EventHandler(this.btnDeleteItems_Click); this.btnDeleteItems.Click += new System.EventHandler(this.btnDeleteItems_Click);
@ -1206,6 +1172,31 @@
this.btnRunRepair.Text = "Run Repair"; this.btnRunRepair.Text = "Run Repair";
this.btnRunRepair.Click += new System.EventHandler(this.btnRunRepair_Click); this.btnRunRepair.Click += new System.EventHandler(this.btnRunRepair_Click);
// //
// sideNavPanel5
//
this.sideNavPanel5.Controls.Add(this.btn_ShowUsers);
this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel5.Location = new System.Drawing.Point(81, 31);
this.sideNavPanel5.Name = "sideNavPanel5";
this.sideNavPanel5.Size = new System.Drawing.Size(299, 494);
this.sideNavPanel5.TabIndex = 14;
this.sideNavPanel5.Visible = false;
//
// btn_ShowUsers
//
this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_ShowUsers.Checked = true;
this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37);
this.btn_ShowUsers.Name = "btn_ShowUsers";
this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23);
this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" +
"d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80)));
this.btn_ShowUsers.TabIndex = 0;
this.btn_ShowUsers.Text = "Show Users";
this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click);
//
// sideNavItem1 // sideNavItem1
// //
this.sideNavItem1.IsSystemMenu = true; this.sideNavItem1.IsSystemMenu = true;
@ -1255,11 +1246,6 @@
this.sideNavItmUsers.Text = "Users"; this.sideNavItmUsers.Text = "Users";
this.sideNavItmUsers.Click += new System.EventHandler(this.sideNavItmUsers_Click); this.sideNavItmUsers.Click += new System.EventHandler(this.sideNavItmUsers_Click);
// //
// buttonItem1
//
this.buttonItem1.Name = "buttonItem1";
this.buttonItem1.Text = "buttonItem1";
//
// sideNavItmDelete // sideNavItmDelete
// //
this.sideNavItmDelete.Checked = true; this.sideNavItmDelete.Checked = true;
@ -1361,6 +1347,11 @@
this.lblAdmToolProgressType.TabIndex = 19; this.lblAdmToolProgressType.TabIndex = 19;
this.lblAdmToolProgressType.Text = "Checking:"; this.lblAdmToolProgressType.Text = "Checking:";
// //
// buttonItem1
//
this.buttonItem1.Name = "buttonItem1";
this.buttonItem1.Text = "buttonItem1";
//
// superTooltip1 // superTooltip1
// //
this.superTooltip1.DefaultTooltipSettings = new DevComponents.DotNetBar.SuperTooltipInfo("", "", "", null, null, DevComponents.DotNetBar.eTooltipColor.Gray); this.superTooltip1.DefaultTooltipSettings = new DevComponents.DotNetBar.SuperTooltipInfo("", "", "", null, null, DevComponents.DotNetBar.eTooltipColor.Gray);

View File

@ -10,6 +10,7 @@ using System.IO;
using Volian.Controls.Library; using Volian.Controls.Library;
using DevComponents.DotNetBar; using DevComponents.DotNetBar;
using JR.Utils.GUI.Forms; using JR.Utils.GUI.Forms;
using Volian.Controls.Library;
namespace VEPROMS namespace VEPROMS
{ {
@ -24,11 +25,17 @@ namespace VEPROMS
private bool IsAdministratorUser = false; //C2020-035 used to control what Set Amins can do private bool IsAdministratorUser = false; //C2020-035 used to control what Set Amins can do
// C2017-030 - new Admin Tools user interface // C2017-030 - new Admin Tools user interface
// pass in session info to constructor // pass in session info to constructor
public frmBatchRefresh(SessionInfo sessionInfo)
private frmVEPROMS _veProms;
public frmBatchRefresh(SessionInfo sessionInfo, frmVEPROMS veProms)
{ {
InitializeComponent(); InitializeComponent();
_MySessionInfo = sessionInfo; _MySessionInfo = sessionInfo;
_veProms = veProms;
// When opening Admin tools Check tab will be default. // When opening Admin tools Check tab will be default.
this.sideNavItmCheck.Checked = true; this.sideNavItmCheck.Checked = true;
@ -36,7 +43,10 @@ namespace VEPROMS
{ {
AdminToolType = (E_AdminToolType)4; AdminToolType = (E_AdminToolType)4;
if (swDeleteFolder.Value) if (swDeleteFolder.Value)
{
ResetDelTV(true); ResetDelTV(true);
setupProgessSteps1();
}
else else
ResetDelTV(false); ResetDelTV(false);
} }
@ -101,6 +111,8 @@ namespace VEPROMS
private Dictionary<TreeNode, ProcedureInfo> myProcedures = new Dictionary<TreeNode, ProcedureInfo>(); private Dictionary<TreeNode, ProcedureInfo> myProcedures = new Dictionary<TreeNode, ProcedureInfo>();
private Dictionary<TreeNode, DocVersionInfo> myDocVersions = new Dictionary<TreeNode, DocVersionInfo>(); private Dictionary<TreeNode, DocVersionInfo> myDocVersions = new Dictionary<TreeNode, DocVersionInfo>();
private Dictionary<TreeNode, FolderInfo> myFolders = new Dictionary<TreeNode, FolderInfo>();
private void frmBatchRefresh_Load(object sender, EventArgs e) private void frmBatchRefresh_Load(object sender, EventArgs e)
{ {
IsClosing = false;//B2017-221 Allow the batch dialog to close when waiting to process. IsClosing = false;//B2017-221 Allow the batch dialog to close when waiting to process.
@ -143,6 +155,7 @@ namespace VEPROMS
//myTreeNodePath = new List<string>(); //myTreeNodePath = new List<string>();
myTV.Nodes.Clear(); myTV.Nodes.Clear();
myDocVersions.Clear(); myDocVersions.Clear();
myFolders.Clear();
FolderInfo fi = FolderInfo.GetTop(); FolderInfo fi = FolderInfo.GetTop();
TreeNode tn = myTV.Nodes.Add(fi.Name); TreeNode tn = myTV.Nodes.Add(fi.Name);
tn.Tag = fi; tn.Tag = fi;
@ -166,44 +179,21 @@ namespace VEPROMS
if (fi.ChildFolderCount > 0) if (fi.ChildFolderCount > 0)
{ {
if (noProcs) TreeNode tn = new TreeNode(fi.Name);
{ tn.Tag = fi;
LoadBottomLevelFolders(fi, myTVdel); tn.StateImageIndex = -1; // Hide the checkbox for the root node
} LoadChildFolders(fi, tn, noProcs);
else myTVdel.Nodes.Add(tn);
{
TreeNode tn = new TreeNode(fi.Name);
tn.Tag = fi;
tn.StateImageIndex = -1; // Hide the checkbox for the root node
LoadChildFolders(fi, tn, noProcs);
myTVdel.Nodes.Add(tn);
}
} }
if (myTVdel.SelectedNode != null) if (myTVdel.SelectedNode != null)
myTVdel.SelectedNode.Expand(); myTVdel.SelectedNode.Expand();
this.Cursor = Cursors.Default;
//btnFixLinks.Enabled = false; //Expand if folders
//this.Cursor = Cursors.WaitCursor; if (noProcs)
////myTreeNodePath = new List<string>(); myTVdel.ExpandAll();
//myTVdel.Nodes.Clear();
//myDocVersions.Clear(); this.Cursor = Cursors.Default;
//FolderInfo fi = FolderInfo.GetTop();
//TreeNode tn = myTVdel.Nodes.Add(fi.Name );
//tn.Tag = fi;
//if (fi.ChildFolderCount > 0)
//{
// if (noProcs)
// {
// LoadBottomLevelFolders(fi, myTVdel);
// }
// else
// LoadChildFolders(fi, tn, noProcs);
//}
//if (myTVdel.SelectedNode != null)
// myTVdel.SelectedNode.Expand();
//this.Cursor = Cursors.Default;
} }
// B2021-060 Higher level folders where being removed from the tree even if there was a child folder that containe a working draft set // B2021-060 Higher level folders where being removed from the tree even if there was a child folder that containe a working draft set
@ -215,10 +205,13 @@ namespace VEPROMS
{ {
TreeNode tnc = tn.Nodes.Add(fic.Name); TreeNode tnc = tn.Nodes.Add(fic.Name);
tnc.Tag = fic; tnc.Tag = fic;
if (fic.ChildFolderCount > 0) if (fic.ChildFolderCount > 0)
{
if (LoadChildFolders(fic, tnc, noProcs)) if (LoadChildFolders(fic, tnc, noProcs))
loadedChildWorkingDraft = true; loadedChildWorkingDraft = true;
// B2020-114 and C2020-035 only show folders the Set Admin can access }
if (fic.FolderDocVersionCount > 0) if (fic.FolderDocVersionCount > 0)
{ {
if (!LoadDocVersions(fic, tnc, noProcs)) if (!LoadDocVersions(fic, tnc, noProcs))
@ -226,40 +219,27 @@ namespace VEPROMS
else else
loadedWorkingDraft = true; loadedWorkingDraft = true;
} }
}
if (loadedChildWorkingDraft) loadedWorkingDraft = true; // B2021-060 if child folder working draft loaded set loadedWorkingDraft
if (tn.Parent != null && !loadedWorkingDraft)
tn.Remove();
return loadedWorkingDraft;
}
/// <summary>
/// Load only bottom layer of folders into treenode.
/// </summary>
/// <param name="fi"></param>
/// <param name="tn"></param>
private void LoadBottomLevelFolders(FolderInfo fi, TreeView treeView)
{
foreach (FolderInfo fic in fi.SortedChildFolders)
{
if (fic.ChildFolderCount > 0)
{
// Recursively call for child folders
LoadBottomLevelFolders(fic, treeView);
}
else else
{ {
if (fic.Name != "PROMS") // Add the folder to the dictionary
{ if (!myFolders.ContainsKey(tnc))
myFolders.Add(tnc, fic);
// If the folder is a bottom-level folder (no child folders), add it directly to the TreeView
TreeNode tnc = treeView.Nodes.Add(fic.Name);
tnc.Tag = fic;
}
} }
} }
if (loadedChildWorkingDraft)
{
loadedWorkingDraft = true;
}
if (tn.Parent != null && !loadedWorkingDraft)
{
tn.Remove();
}
return loadedWorkingDraft;
} }
private bool LoadDocVersions(FolderInfo fic, TreeNode tnc, bool noProcs) private bool LoadDocVersions(FolderInfo fic, TreeNode tnc, bool noProcs)
{ {
bool rtnval = false; bool rtnval = false;
@ -1276,6 +1256,76 @@ namespace VEPROMS
} }
} }
} }
//After check model to select and deselect nodes on the delete and annotation tree.
private void myTV_AfterCheck_DelAnn(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.Nodes.Count > 0)
{
CheckChildNodes_DelAnn(e.Node, e.Node.Checked);
}
}
if (e.Node.Checked)
{
// Ensure child nodes follow the parent node's state
CheckChildNodes_DelAnn(e.Node, e.Node.Checked);
}
else
{
// Automatically deselect parent nodes if current node is unchecked
if (swDeleteFolder.Value)
DiselectParentNodes_DelAnn(e.Node);
}
btnFixLinks.Enabled = AtLeastOneNodeChecked_DelAnn(); // Ensure button is enabled based on custom logic
}
private void DiselectParentNodes_DelAnn(TreeNode node)
{
TreeNode parent = node.Parent;
while (parent != null)
{
parent.Checked = false;
parent = parent.Parent;
}
}
private void DiselectChildNodes_DelAnn(TreeNodeCollection children)
{
foreach (TreeNode child in children)
{
child.Checked = false;
DiselectChildNodes_DelAnn(child.Nodes);
}
}
private void CheckChildNodes_DelAnn(TreeNode treeNode, bool isChecked)
{
foreach (TreeNode tn in treeNode.Nodes)
{
tn.Checked = isChecked;
if (tn.Nodes.Count > 0)
CheckChildNodes_DelAnn(tn, isChecked);
}
}
private bool AtLeastOneNodeChecked_DelAnn()
{
foreach (TreeNode node in myTV.Nodes)
{
if (node.Checked || AnyChildNodeChecked_DelAnn(node))
return true;
}
return false;
}
private bool AnyChildNodeChecked_DelAnn(TreeNode node)
{
foreach (TreeNode childNode in node.Nodes)
{
if (childNode.Checked || AnyChildNodeChecked_DelAnn(childNode))
return true;
}
return false;
}
private ProgressBarItem _ProgressBar = null; private ProgressBarItem _ProgressBar = null;
@ -1466,8 +1516,20 @@ namespace VEPROMS
break; break;
case E_AdminToolType.Delete: case E_AdminToolType.Delete:
splitContainer3.Panel2Collapsed = true; if (swDeleteFolder.Value)
progressSteps1.Visible = false; {
splitContainer3.Panel2Collapsed = false;
progressSteps1.Items.Add(siOrphDatRecs);
lblAdmToolProgressType.Text = "Repairing: ";
progressSteps1.Visible = true;
progressSteps1.Refresh();
}
else
{
lblAdmToolProgressType.Text = "";
splitContainer3.Panel2Collapsed = true;
progressSteps1.Visible = false;
}
break; break;
} }
} }
@ -1669,6 +1731,7 @@ namespace VEPROMS
//C2024-005 Delete Annotations, Delete Folders //C2024-005 Delete Annotations, Delete Folders
private void swDeleteAnnotations_ValueChanged(object sender, EventArgs e) private void swDeleteAnnotations_ValueChanged(object sender, EventArgs e)
{ {
setupProgessSteps1();
swDeleteFolder.Value = !swDeleteAnnotations.Value; swDeleteFolder.Value = !swDeleteAnnotations.Value;
if (swDeleteFolder.Value) if (swDeleteFolder.Value)
ResetDelTV(true); ResetDelTV(true);
@ -1678,6 +1741,7 @@ namespace VEPROMS
private void swDeleteFolder_ValueChanged(object sender, EventArgs e) private void swDeleteFolder_ValueChanged(object sender, EventArgs e)
{ {
setupProgessSteps1();
swDeleteAnnotations.Value = !swDeleteFolder.Value; swDeleteAnnotations.Value = !swDeleteFolder.Value;
if (swDeleteFolder.Value) if (swDeleteFolder.Value)
ResetDelTV(true); ResetDelTV(true);
@ -1691,67 +1755,54 @@ namespace VEPROMS
txtResults.Clear(); txtResults.Clear();
txtProcess.Clear(); txtProcess.Clear();
if (swDeleteFolder.Value) if (swDeleteFolder.Value)
{ {
//TODO process deletions of folders if (FlexibleMessageBox.Show(this, "You sure you want to remove the selected folders and their contents?", "Confirm Folder Deletion", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
txtProcess.AppendText("Deleting Folders..."); {
txtProcess.AppendText("Deleting Folders...");
//List<ProcedureInfo> pil = new List<ProcedureInfo>(); //Load Selected Folders with docversions
//foreach (TreeNode tn in myProcedures.Keys) List<DocVersionInfo> dvil = new List<DocVersionInfo>();
// if (tn.Checked) foreach (TreeNode tn in myDocVersions.Keys)
// pil.Add(myProcedures[tn]); if (tn.Checked)
dvil.Add(myDocVersions[tn]);
////Load Selected Folders //Load Selected Folders with docversions
Dictionary<int, string> folderData = new Dictionary<int, string>(); List<FolderInfo> ef = new List<FolderInfo>();
foreach (TreeNode tn in myFolders.Keys)
//List<FolderInfo> Flist = new List<FolderInfo>(); if (tn.Checked)
//foreach (TreeNode tn in myDocVersions.Keys) ef.Add(myFolders[tn]);
// if (tn.Checked)
// Flist.Add();
//List<DocVersionInfo> dvil = new List<DocVersionInfo>(); ProcessDelete(dvil, ef);
//foreach (TreeNode tn in myDocVersions.Keys) }
// if (tn.Checked)
// dvil.Add(myDocVersions[tn]);
//foreach (TreeNode tn in myTVdel.Nodes)
//{
// if (tn.Checked)
// {
// var itemInfo = myProcedures[tn];
// folderData.Add(itemInfo.ItemID, itemInfo.DisplayText);
// }
//}
//ProcessDelete(dvil);
} }
else else
{ {
// Write progress status // Write progress status
txtProcess.AppendText("Deleting Annotations..." + Environment.NewLine); txtProcess.AppendText("Deleting Annotations...");
// Create a list of procedures the user selected // Create a list of procedures the user selected
List<ProcedureInfo> pil = new List<ProcedureInfo>(); List<ProcedureInfo> pil = new List<ProcedureInfo>();
foreach (TreeNode tn in myProcedures.Keys) foreach (TreeNode tn in myProcedures.Keys)
if (tn.Checked) if (tn.Checked)
pil.Add(myProcedures[tn]); pil.Add(myProcedures[tn]);
// Create a list of doc versions the user selected // Create a list of doc versions the user selected
List<DocVersionInfo> dvil = new List<DocVersionInfo>(); List<DocVersionInfo> dvil = new List<DocVersionInfo>();
foreach (TreeNode tn in myDocVersions.Keys) foreach (TreeNode tn in myDocVersions.Keys)
if (tn.Checked) if (tn.Checked)
dvil.Add(myDocVersions[tn]); dvil.Add(myDocVersions[tn]);
frmAnnotationsCleanup frmAnnoDel = new frmAnnotationsCleanup(this, pil, dvil); frmAnnotationsCleanup frmAnnoDel = new frmAnnotationsCleanup(this, pil, dvil);
frmAnnoDel.ShowDialog(); frmAnnoDel.ShowDialog();
} }
} }
private void ProcessDelete(List<DocVersionInfo> foldersToDelete) private void ProcessDelete(List<DocVersionInfo> foldersToDelete, List<FolderInfo> emptyFoldersToDelete)
{ {
DateTime pStart = DateTime.Now; DateTime pStart = DateTime.Now;
txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine);
@ -1760,11 +1811,12 @@ namespace VEPROMS
foreach (var kvp in foldersToDelete) foreach (var kvp in foldersToDelete)
{ {
int itemID = (int)kvp.ItemID; //Gather folder information
string folderName = kvp.Name; FolderInfo fi = (FolderInfo)kvp.ActiveParent;
int itemID = (int)fi.FolderID;
string folderName = fi.Name;
// Perform the deletion operation // Perform the deletion operation
// Assume DeleteFolderByID is a method that deletes the folder by its ItemID
bool deletionSuccessful = DeleteFolderByID(itemID); bool deletionSuccessful = DeleteFolderByID(itemID);
// Update txtProcess with the progress // Update txtProcess with the progress
@ -1778,13 +1830,61 @@ namespace VEPROMS
} }
txtProcess.AppendText(Environment.NewLine); txtProcess.AppendText(Environment.NewLine);
} }
//Delete non working info folders.
foreach (var kvp in emptyFoldersToDelete)
{
//Gather folder information
FolderInfo fi = (FolderInfo)kvp;
int itemID = (int)fi.FolderID;
string folderName = fi.Name;
// Perform the deletion operation
bool deletionSuccessful = DeleteFolderByID(itemID);
// Update txtProcess with the progress
if (deletionSuccessful)
{
txtProcess.AppendText($"Successfully deleted folder: {folderName} (ID: {itemID})");
}
else
{
txtProcess.AppendText($"Failed to delete folder: {folderName} (ID: {itemID})");
}
txtProcess.AppendText(Environment.NewLine);
}
//Run Repair
int prgStpIdx = -1;
StepProgress(++prgStpIdx, 50);
PurgeDisconnectedItems(); // Orphan Items
StepProgress(prgStpIdx, 100);
//rebuild
ResetDelTV(true);
MessageBox.Show("Folder Deletion Completed", "Delete Folders");
ClearStepProgress();
} }
// Example deletion method
private bool DeleteFolderByID(int itemID) private bool DeleteFolderByID(int folderID)
{ {
// Implement your folder deletion logic here try
// Return true if deletion was successful, false otherwise {
return true; // Placeholder //Delete
Folder.DeleteFolderAdmin(folderID);
//update treeview UI via veProms
_veProms.tv_FolderDelete(folderID);
return true;
}
catch (Exception ex)
{
string err = ex.ToString();
return false;
}
} }
public List<ProcedureInfo> RetrieveChkAnnotations() public List<ProcedureInfo> RetrieveChkAnnotations()

View File

@ -153,6 +153,13 @@ If more than one procedure is selected, it is recommended that this be performed
Click on the on/off switches to turn on/off each tool. Click on the on/off switches to turn on/off each tool.
Note that only one of these tools can be run at a time.</value>
</data>
<data name="btnDeleteItems.SuperTooltip" xml:space="preserve">
<value>This will allow for the deletion of groups of annotations and allow for deleting entire folders within PROMS. Use the tree nodes to select which items to delete.
Click on the on/off switches to turn on/off each tool.
Note that only one of these tools can be run at a time.</value> Note that only one of these tools can be run at a time.</value>
</data> </data>
<data name="swCheckROLinks.SuperTooltip" xml:space="preserve"> <data name="swCheckROLinks.SuperTooltip" xml:space="preserve">

View File

@ -254,6 +254,21 @@ namespace VEPROMS
tc.RefreshItem(myItemInfo); tc.RefreshItem(myItemInfo);
} }
public void tv_FolderDelete(int folderId)
{
// Create an instance of the event args if needed
var args = new vlnTreeFolderDeleteEventArgs(folderId);
// Trigger the deletion using the event arguments
tv.RemoveFolder(args.FolderId);
}
private bool Tv_DeleteFolder(object sender, vlnTreeFolderDeleteEventArgs args)
{
tv.RemoveFolder(args.FolderId);
return true;
}
private E_UCFImportOptions _UCFImportOptionsFromSettings; private E_UCFImportOptions _UCFImportOptionsFromSettings;
public frmVEPROMS() public frmVEPROMS()
@ -474,6 +489,7 @@ namespace VEPROMS
tv.NodeNew += new vlnTreeViewEvent(tv_NodeNew); tv.NodeNew += new vlnTreeViewEvent(tv_NodeNew);
tv.OpenItem += new vlnTreeViewItemInfoEvent(tv_OpenItem); tv.OpenItem += new vlnTreeViewItemInfoEvent(tv_OpenItem);
tv.TabDisplay += new StepPanelTabDisplayEvent(tc_PanelTabDisplay); tv.TabDisplay += new StepPanelTabDisplayEvent(tc_PanelTabDisplay);
tv.DeleteFolder += new vlnTreeViewItemInfoDeleteFolderEvent(Tv_DeleteFolder);
tv.DeleteItemInfo += new vlnTreeViewItemInfoDeleteEvent(tv_DeleteItemInfo); tv.DeleteItemInfo += new vlnTreeViewItemInfoDeleteEvent(tv_DeleteItemInfo);
tv.InsertItemInfo += new vlnTreeViewItemInfoInsertEvent(tv_InsertItemInfo); tv.InsertItemInfo += new vlnTreeViewItemInfoInsertEvent(tv_InsertItemInfo);
tv.NodeInsert += new vlnTreeViewEvent(tv_NodeInsert); tv.NodeInsert += new vlnTreeViewEvent(tv_NodeInsert);
@ -2741,7 +2757,7 @@ namespace VEPROMS
void btnAdministrativeTools_Click(object sender, EventArgs e) void btnAdministrativeTools_Click(object sender, EventArgs e)
{ {
frmBatchRefresh frm = new frmBatchRefresh(MySessionInfo); frmBatchRefresh frm = new frmBatchRefresh(MySessionInfo, this);
frm.ProgressBar = bottomProgBar; frm.ProgressBar = bottomProgBar;
frm.ShowDialog(this); frm.ShowDialog(this);
} }

View File

@ -1433,6 +1433,31 @@ namespace VEPROMS.CSLA.Library
throw new DbCslaException("Folder.Remove", ex); throw new DbCslaException("Folder.Remove", ex);
} }
} }
[Transactional(TransactionalTypes.TransactionScope)]
public static void DeleteFolderAdmin(int folderID)
{
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] Folder.Remove", 0);
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandTimeout = Database.SQLTimeout;
cm.CommandText = "deleteFolderAdmin";
cm.Parameters.AddWithValue("@FolderID", folderID);
cm.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
if (_MyLog.IsErrorEnabled) _MyLog.Error("Folder.Remove", ex);
throw new DbCslaException("Folder.Remove", ex);
}
}
#endregion #endregion
#region Exists #region Exists
public static bool Exists(int folderID) public static bool Exists(int folderID)

View File

@ -1,36 +1,36 @@
namespace Volian.Controls.Library namespace Volian.Controls.Library
{ {
partial class vlnTreeView partial class vlnTreeView
{ {
/// <summary> /// <summary>
/// Required designer variable. /// Required designer variable.
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// Clean up any resources being used. /// Clean up any resources being used.
/// </summary> /// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected void Dispose(bool disposing) protected void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))
{ {
components.Dispose(); components.Dispose();
} }
base.Dispose(disposing); base.Dispose(disposing);
} }
#region Component Designer generated code #region Component Designer generated code
/// <summary> /// <summary>
/// Required method for Designer support - do not modify /// Required method for Designer support - do not modify
/// the contents of this method with the code editor. /// the contents of this method with the code editor.
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
components = new System.ComponentModel.Container(); components = new System.ComponentModel.Container();
} }
#endregion #endregion
} }
} }

View File

@ -26,7 +26,9 @@ namespace Volian.Controls.Library
public delegate void vlnTreeViewItemInfoEvent(object sender, vlnTreeItemInfoEventArgs args); public delegate void vlnTreeViewItemInfoEvent(object sender, vlnTreeItemInfoEventArgs args);
public delegate bool vlnTreeViewBoolEvent(object sender, vlnTreeEventArgs args); public delegate bool vlnTreeViewBoolEvent(object sender, vlnTreeEventArgs args);
public delegate bool vlnTreeViewItemInfoDeleteEvent(object sender, vlnTreeItemInfoEventArgs args); public delegate bool vlnTreeViewItemInfoDeleteEvent(object sender, vlnTreeItemInfoEventArgs args);
public delegate bool vlnTreeViewItemInfoInsertEvent(object sender, vlnTreeItemInfoInsertEventArgs args); public delegate bool vlnTreeViewItemInfoInsertEvent(object sender, vlnTreeItemInfoInsertEventArgs args);
public delegate bool vlnTreeViewItemInfoDeleteFolderEvent(object sender, vlnTreeFolderDeleteEventArgs args);
public delegate bool vlnTreeViewItemInfoPasteEvent(object sender, vlnTreeItemInfoPasteEventArgs args); public delegate bool vlnTreeViewItemInfoPasteEvent(object sender, vlnTreeItemInfoPasteEventArgs args);
public delegate TreeNode vlnTreeViewTreeNodeEvent(object sender, vlnTreeEventArgs args); public delegate TreeNode vlnTreeViewTreeNodeEvent(object sender, vlnTreeEventArgs args);
public delegate DialogResult vlnTreeViewPropertyEvent(object sender, vlnTreePropertyEventArgs args); public delegate DialogResult vlnTreeViewPropertyEvent(object sender, vlnTreePropertyEventArgs args);
@ -220,6 +222,15 @@ namespace Volian.Controls.Library
} }
#endregion #endregion
} }
public class vlnTreeFolderDeleteEventArgs : EventArgs
{
public int FolderId { get; }
public vlnTreeFolderDeleteEventArgs(int folderId)
{
FolderId = folderId;
}
}
public enum E_InsertType {Before, After, Child}; public enum E_InsertType {Before, After, Child};
public partial class vlnTreeItemInfoInsertEventArgs public partial class vlnTreeItemInfoInsertEventArgs
{ {
@ -427,6 +438,12 @@ namespace Volian.Controls.Library
if (DeleteItemInfo != null) return DeleteItemInfo(sender, args); if (DeleteItemInfo != null) return DeleteItemInfo(sender, args);
return false; return false;
} }
public event vlnTreeViewItemInfoDeleteFolderEvent DeleteFolder;
private bool OnDeleteFolder(object sender, vlnTreeFolderDeleteEventArgs args)
{
if (DeleteItemInfo != null) return DeleteFolder(sender, args);
return false;
}
public event vlnTreeViewItemInfoInsertEvent InsertItemInfo; public event vlnTreeViewItemInfoInsertEvent InsertItemInfo;
private bool OnInsertItemInfo(object sender, vlnTreeItemInfoInsertEventArgs args) private bool OnInsertItemInfo(object sender, vlnTreeItemInfoInsertEventArgs args)
{ {
@ -551,6 +568,11 @@ namespace Volian.Controls.Library
{ {
if (ProcedureCheckedOutTo != null) ProcedureCheckedOutTo(sender, args); if (ProcedureCheckedOutTo != null) ProcedureCheckedOutTo(sender, args);
} }
public event vlnTreeViewEvent ExportImportProcedureSets; public event vlnTreeViewEvent ExportImportProcedureSets;
private void OnExportImportProcedureSets(object sender, vlnTreeEventArgs args) private void OnExportImportProcedureSets(object sender, vlnTreeEventArgs args)
{ {
@ -1059,6 +1081,11 @@ namespace Volian.Controls.Library
#region Menu_Delete #region Menu_Delete
if (ok) if (ok)
{ {
// Add delete to the menu unless at the very 'top' node, on a grouping (partinfo) // Add delete to the menu unless at the very 'top' node, on a grouping (partinfo)
// node (RNOs, Steps, Cautions, Notes) or Folder/DocVersion that contains any items. // node (RNOs, Steps, Cautions, Notes) or Folder/DocVersion that contains any items.
@ -1082,6 +1109,7 @@ namespace Volian.Controls.Library
} }
} }
} }
#endregion #endregion
//_MyLog.WarnFormat("Context Menu 6 - {0}", GC.GetTotalMemory(true)); //_MyLog.WarnFormat("Context Menu 6 - {0}", GC.GetTotalMemory(true));
#region Menu_ExternalTransitions #region Menu_ExternalTransitions
@ -1940,6 +1968,16 @@ namespace Volian.Controls.Library
OnPrintTransitionReport(this, new vlnTreeEventArgs(SelectedNode as VETreeNode)); OnPrintTransitionReport(this, new vlnTreeEventArgs(SelectedNode as VETreeNode));
return; return;
} }
if (mi.Text == "Export Procedure Set" || mi.Text == "Export Procedure") if (mi.Text == "Export Procedure Set" || mi.Text == "Export Procedure")
{ {
OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0)); OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0));
@ -2408,6 +2446,7 @@ namespace Volian.Controls.Library
} }
} }
VETreeNode tn = SelectedNode as VETreeNode; VETreeNode tn = SelectedNode as VETreeNode;
DocVersionInfo dvi = tn.VEObject as DocVersionInfo; DocVersionInfo dvi = tn.VEObject as DocVersionInfo;
// Check for paste into a docversion - queries/code is different than paste related to an item (into a proc or section) // Check for paste into a docversion - queries/code is different than paste related to an item (into a proc or section)
if (dvi != null) if (dvi != null)
@ -2579,6 +2618,7 @@ namespace Volian.Controls.Library
// B2018-047: was crashing on the following line (before change it was casting the result to a VETreeNote when the partn.FirstNode was just a TreeNode) // B2018-047: was crashing on the following line (before change it was casting the result to a VETreeNote when the partn.FirstNode was just a TreeNode)
SelectedNode = prevtn != null ? prevtn.NextNode : partn.FirstNode; SelectedNode = prevtn != null ? prevtn.NextNode : partn.FirstNode;
return replItemInfo; return replItemInfo;
} }
public void PasteRepalceEmpty(VETreeNode tn, int copyStartID) public void PasteRepalceEmpty(VETreeNode tn, int copyStartID)
{ {
@ -3582,6 +3622,41 @@ namespace Volian.Controls.Library
} }
return false; return false;
} }
public void RemoveFolder(int folderId)
{
TreeNode nodeToRemove = FindNodeById(folderId, this.Nodes);
if (nodeToRemove != null)
{
// Perform the removal logic
nodeToRemove.Remove(); // This removes the node from its parent
}
}
private TreeNode FindNodeById(int folderId, TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
VETreeNode vetNode = node as VETreeNode;
if (vetNode != null)
{
FolderInfo folderInfo = vetNode.VEObject as FolderInfo;
if (folderInfo != null && folderInfo.FolderID == folderId)
{
return node;
}
else
{
TreeNode foundNode = FindNodeById(folderId, node.Nodes);
if (foundNode != null)
{
return foundNode;
}
}
}
}
return null;
}
private bool DeleteItemInfoAndChildren(ItemInfo ii) private bool DeleteItemInfoAndChildren(ItemInfo ii)
{ {
DateTime dtStart = DateTime.Now; DateTime dtStart = DateTime.Now;