PDA

View Full Version : حذف نود انتخاب شده در treeview



mdshmdsh
دوشنبه 05 آبان 1393, 07:33 صبح
سلام به همه ...
من یه مشکل خاص دارم که هرچقدر توی سایت ها گشتم،نتونستم مشکلم رو حل کنم.

خب توضیح کلی: من یه برنامه دارم که میاد و یه subfolder میگیره و محتویات اون رو بصورت درختی در treeviwe نشون میده. می خوام کاربر با انتخاب Checked box نود ها، بتونه فایل ها و فولدر های زیر مجموعه اون نود رو بصورت فیزیکی و هم در نمایش treeviwe حذف کنه. در حذف فایل ها بصورت فیزیکی مشکلی ندارم.

مشکل من: مش کلی من موقعی هست که می خوام نود ها رو در treeviwe حذف کنم. وقتی چند تا نود پشت سر هم انتخاب میشه، یکی در میون حذف می کنه، انگار با حذف یه نود خود برنامه next میده.

سورس من:
(Sub removecheked(ByVal rootNode As TreeNode
()If rootNode.Checked Then tvn.Remove
For Each tvn In rootNode.Nodes
If tvn.Checked Then
tvn.Remove()
End If
(removecheked(tvn
Next

end sub
امیدوارم بتونید کمکم کنید تا بتونم در treeviwe نود های Checked شده رو براحتی پاک کنم. راستی یکی از دوستان به من گفت خب از آخر نود ها رو حذف کن و بیا تا بالا، اما من این روش رو بلد نیستم. لطفا کد بزارید. ممنون

as987498749874
دوشنبه 05 آبان 1393, 13:01 عصر
من یه برنامه دارم که میاد و یه subfolder میگیره و محتویات اون رو بصورت درختی در treeviwe نشون میده.

در حذف فایل ها بصورت فیزیکی مشکلی ندارم.

اگه درست متوجه شدم کار راحتیه
شما میگین که فولدر ها راحت حذف میشن . خوب دوباره دستور لود فولدر ها و ساختار درخت رو اجرا کنید! همون کاری که اول انجام دادین!

mdshmdsh
دوشنبه 05 آبان 1393, 13:31 عصر
نه متوجه مشکلم نشدی. اصلا بحث من در مورد حذف فولدر نیست. من تو حذف نود ها مشکل دارم. ببین این سورس کل برنامه هست:
Imports System.IO


Public Class Form1
Dim t As Integer
Dim t2 As Integer
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim fbd As New FolderBrowserDialog
If direct.Text = "" Then
fbd.SelectedPath = "c:\"
Else
fbd.SelectedPath = direct.Text
End If
If fbd.ShowDialog() = DialogResult.OK Then
direct.Text = fbd.SelectedPath
End If
End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Nd As New TreeNode()
Dim directories() As String
TreeView1.Nodes.Clear()
Try
directories = System.IO.Directory.GetDirectories(direct.Text, "*", IO.SearchOption.TopDirectoryOnly)
Catch exc As Exception
'MsgBox("مسیر دایرکتوری انتخاب نشده")
End Try


If direct.Text = "" Then
MsgBox("مسیر دایرکتوری انتخاب نشده")
Else
Dim SourceDir As DirectoryInfo = New DirectoryInfo(direct.Text)
If SourceDir.Exists Then
Nd = TreeView1.Nodes.Add(SourceDir.FullName)
ScanFolder_file(SourceDir.FullName, Nd)
Else
MsgBox("مسیر دایرکتوری مورد نظر وجود ندارد: " + direct.Text)
End If
End If
TreeView1.ExpandAll()
End Sub
Sub ScanFolder_file(ByVal folderSpec As String, ByRef currentNode As TreeNode) ' لیست کردن نودها در treeviwe
Dim thisFolder As String
Dim allFolders() As String
Dim SubDir As DirectoryInfo
Dim x As DirectoryInfo
Dim a As Integer
'Delay(0.01)
If Directory.Exists(folderSpec) Then
allFolders = Directory.GetDirectories(folderSpec)
For Each thisFolder In allFolders
Dim Nd As TreeNode
Nd = New TreeNode(thisFolder)
x = New DirectoryInfo(thisFolder)
currentNode.Nodes.Add(Nd)
If Microsoft.VisualBasic.Left(x.Name, 2) = "91" And (Len(x.Name)) = 10 Then
t += 1
Nd.ForeColor = Color.Blue
End If
t2 += 1
Nd.Text = x.Name
currentNode.Expand()
folderSpec = thisFolder
SubDir = New DirectoryInfo(thisFolder)
a = 0
For Each childFile As FileInfo In SubDir.GetFiles("*", SearchOption.TopDirectoryOnly)
a += 1
'For Each filepath As String In Directory.GetFiles(folderSpec)
Nd.Expand()
Nd.Nodes.Add(childFile.Name)
If (childFile.Extension <> ".jpg" And childFile.Extension <> ".JPG" Or Math.Round(Val((childFile.Length / 1024)), 2) > 120) And (childFile.Extension <> ".tif" And childFile.Extension <> ".TIF" Or Math.Round(Val((childFile.Length / 1024)), 2) > 20) Then
Nd.Nodes.Item(a - 1).ForeColor = Color.Red
End If
Next


ScanFolder_file(folderSpec, Nd)


Me.Refresh()
Next


End If
End Sub


Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click


Dim result1 As DialogResult = MessageBox.Show("آیا از حذف موارد اطمینان دارید؟", _
"اخطار", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question)
If result1 = DialogResult.Yes Then
Try
'DeleteDirectory_file2(TreeView1.Nodes(0))
removecheked(TreeView1.Nodes(0))
MessageBox.Show("فایل مورد نظر با موفقیت حذف شد")
Catch exc As Exception
'MessageBox.Show("مواردی برای حذف وجود نداشت")
End Try
End If


End Sub
Sub removecheked(ByVal rootNode As TreeNode) ' حذف نود های انتخاب شده از treeview
'Public Function removecheked(ByVal rootNode As TreeNode) As Integer






Dim tvn As TreeNode
If rootNode.Checked Then rootNode.Remove()
For Each tvn In rootNode.Nodes
If tvn.Checked Then


tvn.Remove()




End If
removecheked(tvn)
Next


End Sub
Private Sub node_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck
' The code only executes if the user caused the checked state to change.
If e.Action <> TreeViewAction.Unknown Then
If e.Node.Nodes.Count > 0 Then
' Calls the CheckAllChildNodes method, passing in the current
' Checked value of the TreeNode whose checked state changed.
Me.CheckAllChildNodes(e.Node, e.Node.Checked)
End If
End If
End Sub


Private Sub CheckAllChildNodes(ByVal treeNode As TreeNode, ByVal nodeChecked As Boolean) ' تیک زدن زیر شاخه های نود انتخاب شده پدر
Dim node As TreeNode
For Each node In treeNode.Nodes
node.Checked = nodeChecked
If node.Nodes.Count > 0 Then
' If the current node has child nodes, call the CheckAllChildsNodes method recursively.
Me.CheckAllChildNodes(node, nodeChecked)
End If
Next node
End Sub
End Class
مشکل من توی فراخوانی تابع removecheked هست.
بعد از اینکه DeleteDirectory_file2(TreeView1.Nodes(0)) کارش تموم شد و فولدر ها رو بصورت فیزیکی حذف کرد یه تابع جداگانه(removecheked) گذاشتم که بعد اون بیاد و نود های تیک دار رو حذف کنه ولی اینکار رو یکی در میون انجام میده. البته اگه پشت سر هم انتخاب شده باشه.

as987498749874
سه شنبه 06 آبان 1393, 08:51 صبح
خوب مهندس جان شما مگه اول دایرکتوری ها رو نمی خونی و توی تری ویو میریزی!!!!
خوب مرحله بعد هم میای و دایرکتوری نودهای تیک دار رو حذف می کنی!!!

تا اینجا که کار میکنه!!! چیزی که متوجه شدم

خوب مهندس یه دستور Clear بزن به تری ویو و دوباره دستور ایجاد نود رو از دایرکتور های موجود دوباره تکرار کن . همون کاری که اولین بار انجام شده است.

mdshmdsh
سه شنبه 06 آبان 1393, 11:31 صبح
ببخشید ها، این رو که خوب بلد هستم ولی این چه کاریه؟ مثل دور سرچرخوندن یه لقمه هست که بدرستی می تونستی بخوریش؟

mdshmdsh
چهارشنبه 07 آبان 1393, 09:07 صبح
متوجه مشکلم شدین؟