PDA

View Full Version : treeview



pooyansystem
یک شنبه 20 خرداد 1386, 08:02 صبح
یه TreeView دارم که از چند تا Root و یه سری child تشکیل شده چه طور میتونم کاری کنم که وقتی chekbox تمام child ها True شد Chechbox مربوط به Root اون child ها هم true شود یا بر عکس یعنی اگه چک باکس Root رو true کردم تمام Child های اون هم true بشن
و در ضمن می خوام اگه یه child انتخاب شد root اون هم به صورت مات یه تیک بخوره

Keramatifar
یک شنبه 20 خرداد 1386, 08:47 صبح
دوست عزیز
اگه اشتباه نکنم Treeview یک Property به اسم AutoSelectParent و AutoSelectChild داره که می تونی از اینها بررای کاری که می خوای بکنی استفاده کنی

pooyansystem
دوشنبه 21 خرداد 1386, 08:01 صبح
این property که شما گفتید رو من پیدا نکردم برنامه من یه Win Application است شاید اون چیزی که شما گفتید تو Web باشه
کسی نظری نداره

pooyansystem
سه شنبه 22 خرداد 1386, 07:59 صبح
چرا هیچ کس جواب نمیده یعنی تا حالا هیچ کس به یه همچین موردی بر نخورده

ghafoori
سه شنبه 22 خرداد 1386, 20:22 عصر
دوست عزیز من پیشنهاد می کنم با کد این کار را انجام دهید کدی بنویسید که این کار را انجام دهد
من یک کد نوشتم اما با وی بی و زیاد هم درست کار نمی کنه اخه منطقش یکم سخته من فرصت فکر کردن رو این مسئله را ندارم اگر می خواهید کد را بزارم

kiani.mehdi
سه شنبه 22 خرداد 1386, 23:30 عصر
سوال شما اشتباه
در واقع این کاری میخوای بکنی غیر ممکنه
البته قسمت اول و دومش دسته
یعنی


چه طور میتونم کاری کنم که وقتی chekbox تمام child ها True شد Chechbox مربوط به Root اون child ها هم true شود



و




گه چک باکس Root رو true کردم تمام Child های اون هم true بشن


می تونن هم زمان اتفاق بیافتند
ولی حالت دوم با حالت



در ضمن می خوام اگه یه child انتخاب شد root اون هم به صورت مات یه تیک بخوره

در تناقض هست

تو می خوای وقتی یک root تیک خورد ، تمام child ها هم تیک بخورن و وقتی که یه child تیک خورد root اون هم تیک بخوره
فکر نمیکنی یه حلقه بی نهایت ایجاد میشه ؟
جون وقتی یه root تیک بخوره حداقل یکی از child ها هم تیک میخورن (البته همه child ها) و با تیک خوردن یکی از child ها دوباره root تیک میخوره و این روند دائم تکرار میشه

اما مورد اول و دوم را میشه با هم پیاده سازی کرد
البته امیدوارم که منظورت را درست فهمیده باشم
اگه درست متوجه نشدم بیشتر توضیح بده
موفق باشید
مهدی کیانی

iranrose63
چهارشنبه 23 خرداد 1386, 06:44 صبح
دوست عزیز من پیشنهاد می کنم با کد این کار را انجام دهید کدی بنویسید که این کار را انجام دهد
من یک کد نوشتم اما با وی بی و زیاد هم درست کار نمی کنه اخه منطقش یکم سخته من فرصت فکر کردن رو این مسئله را ندارم اگر می خواهید کد را بزارم
متشکر میشم کد رو بذارید

iranrose63
چهارشنبه 23 خرداد 1386, 06:45 صبح
سوال شما اشتباه
در واقع این کاری میخوای بکنی غیر ممکنه
البته قسمت اول و دومش دسته
یعنی


و


می تونن هم زمان اتفاق بیافتند
ولی حالت دوم با حالت

در تناقض هست

تو می خوای وقتی یک root تیک خورد ، تمام child ها هم تیک بخورن و وقتی که یه child تیک خورد root اون هم تیک بخوره
فکر نمیکنی یه حلقه بی نهایت ایجاد میشه ؟
جون وقتی یه root تیک بخوره حداقل یکی از child ها هم تیک میخورن (البته همه child ها) و با تیک خوردن یکی از child ها دوباره root تیک میخوره و این روند دائم تکرار میشه

اما مورد اول و دوم را میشه با هم پیاده سازی کرد
البته امیدوارم که منظورت را درست فهمیده باشم
اگه درست متوجه نشدم بیشتر توضیح بده
موفق باشید
مهدی کیانی
من یه جایی یه همچین چیزی دیدم پس احتمالا میشه یه همچین کاری کرد

iranrose63
چهارشنبه 23 خرداد 1386, 06:46 صبح
اگه درست متوجه نشدم بیشتر توضیح بده
موفق باشید
مهدی کیانی
آقای کیانی اگه منظور این باشه حالا همون دوتا کار اول رو چه طور انجام بدم

pooyansystem
چهارشنبه 23 خرداد 1386, 06:53 صبح
دوست عزیز من پیشنهاد می کنم با کد این کار را انجام دهید کدی بنویسید که این کار را انجام دهد
من یک کد نوشتم اما با وی بی و زیاد هم درست کار نمی کنه اخه منطقش یکم سخته من فرصت فکر کردن رو این مسئله را ندارم اگر می خواهید کد را بزارم
من به شدت به انجام این کار نیاز دارم اگه میشه کد رو برام بذارید

ghafoori
چهارشنبه 23 خرداد 1386, 07:15 صبح
دوست عزیز کد من الان کمی مشکل داره اما منطقش این است که از رویداد after check در درخت استفاده می کند و دو تابع check_childو check_parent دارد
تابع check_child کارش این است که اگر یک نود تیک بخورد تمام فرزندهای انرا تیک بزند و اگر تیک ان برداشته شود برای تمام فرزندهای ان این کار انجام شود
تابع check_parent ریشه نودی که تیک خورده را می گیرد و تمام ان نود ها را کنترل می کند که ایا تیک خوردن یا نه اگر همگی تیک خوردن خود ریشه را تیک می زند و اگر نود ما تیکش برداشته شود
البته باید یک متغییر هم بگذارید تا در اثر تیک برداشتن فرزند یک ریشه تمام فرزندهای ان تیکشان برداشته نشود ایت الگوریتم من است این هم کدش فکر کنم یکم روش کار بشه جواب بده


Dim ch As TreeNode
Dim exit_event As Boolean
Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
check_child(e.Node)
If e.Node.Checked = True Then
check_parent(e.Node.Parent, True)
Else
check_parent(e.Node.Parent, False)
End If

End Sub

Sub check_child(ByVal t As TreeNode)
If t.Checked = True Then
For Each ch In t.Nodes
If ch.Checked = False Then
ch.Checked = True
End If
Next
Else
If exit_event = True Then
Exit Sub
exit_event = False
Else
For Each ch In t.Nodes
If ch.Checked = True Then
ch.Checked = False
End If
Next
'exit_event = False
End If

End If

End Sub
Sub check_parent(ByVal t As TreeNode, ByVal check As Boolean)
Dim not_full_checked As Boolean
If check = True Then
Try
For Each ch In t.Nodes
If ch.Checked = False Then
not_full_checked = True
End If
Next
If not_full_checked = False Then
t.Checked = True
End If
Catch ex As Exception
End Try
Else
Try
t.Checked = False
exit_event = True
Catch ex As Exception

End Try

End If



End Sub

من فکر می کنم مشکل داخل این تابع check parent هستش

iranrose63
چهارشنبه 23 خرداد 1386, 08:52 صبح
آقای غفوری جوابتون خیلی خوب بود فقط اگه دو خط زیر رو هم به برنامه اضافه کنید دیگه هیچ مشکلی نداره (البته تا جایی که من امتحان کردم)

exit_event = false;
if (e.Node.Parent != null)

این دو خط رو باید در event AfterCheck بعد از;(check_child(e.Node نوشت در واقع کد AfterCheck به صورت زیر خواهد شد


check_child(e.Node);
exit_event = false;
if (e.Node.Parent != null)
{
if (e.Node.Checked)
check_parent(e.Node.Parent, true);
else
check_parent(e.Node.Parent, false);
}