PDA

View Full Version : سوال: تعداد گره های باز در TreeView



water_lily_2012
پنج شنبه 28 مهر 1390, 16:42 عصر
سلام
چگونه تعداد گره هایی که الان در حال نمایش هستند را بدست آورم. مثلا اگر 5 گره اصلی دارم و از این 5 تا 2 تای آنها باز هستند. تعداد گره های این دو گره اصلی که باز هستند را می خواهم.
یعنی تعداد کل گره های موجود در Treeview را نمی خواهم و آنهایی که باز هستند را نیاز دارم.

Amir Oveisi
سه شنبه 03 آبان 1390, 23:24 عصر
هر TreeViewItem ای یک property‌ داره به اسم IsExpanded (http://msdn.microsoft.com/en-us/library/system.windows.controls.treeviewitem.isexpanded.as px).
باید دونه دونه چک کنید ببینید بین TreeViewItem هایی که TreeView تون داره چند تا IsExpanded‌ شون true هست.

water_lily_2012
چهارشنبه 04 آبان 1390, 08:45 صبح
سلام
میشه لطف کنید یک چند خط کد بنویسید یا یک نمونه بگذارید. بعد چگونه تعداد گره های داخلی هر گره را تشخیص بدهم.

PetekDincos
چهارشنبه 04 آبان 1390, 09:42 صبح
با سلام
کد XAML مربوط به ویندو


<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TreeView Name="MyTreeView">
<TreeViewItem Header="Main 01">
<TreeViewItem Header="Sub 1-1" >
<TreeViewItem Header="Sub 1-1-1" />
</TreeViewItem>
<TreeViewItem Header="Sub 1-2"/>
<TreeViewItem Header="Sub 1-3">
<TreeViewItem Header="Sub 1-3-1" />
</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="Main 02">
<TreeViewItem Header="Sub 2-1"/>
<TreeViewItem Header="Sub 2-2">
<TreeViewItem Header="Sub 2-2-1" />
</TreeViewItem>
<TreeViewItem Header="Sub 2-3"/>
</TreeViewItem>
</TreeView>
<Button Content="Get Opened Tree" Grid.Row="1" Width="200" Height="30" Click="Button_Click" />
</Grid>

و متد مربوط به رویداد کلیک باتن


private void Button_Click(object sender, RoutedEventArgs e)
{
int Count = 0;
foreach (TreeViewItem item in MyTreeView.Items)
{
if (item.IsExpanded)
{
Count++;
foreach (TreeViewItem item2 in item.Items)
{
if (item2.IsExpanded)
Count++;
}
}
}
MessageBox.Show(Count.ToString());
}

با تشکر

مهدی فرزاد
چهارشنبه 04 آبان 1390, 12:37 عصر
سلام
کد با لا یک اشکال داره
اگر تعداد زیر مجموعه هایی که خودشون زیر مجموعه دارن بیشتر بشه اونها رو نمی تونه بشماره الان تا دو سطح رو میشماره و اگر ما ندونیم چند سطح داریم این کد جواب نمیده

من کد دیگه ای رو تست نکردم فقط میتونم بگم هر Item یک اونت به نام Expanded داره که اگر اضافه شدن هر گره رو با کد نویسی در C#‎ انجام بدیم میتونیم این Event رو هم براش تعریف کنیم و در در این Event مشخص کنید اگر کره باز شد به متغییر Count یکی اضافه و اگر بسته شد یکی کم کنه

water_lily_2012
چهارشنبه 04 آبان 1390, 13:38 عصر
سلام
کد با لا یک اشکال داره
اگر تعداد زیر مجموعه هایی که خودشون زیر مجموعه دارن بیشتر بشه اونها رو نمی تونه بشماره الان تا دو سطح رو میشماره و اگر ما ندونیم چند سطح داریم این کد جواب نمیده

من کد دیگه ای رو تست نکردم فقط میتونم بگم هر Item یک اونت به نام Expanded داره که اگر اضافه شدن هر گره رو با کد نویسی در C#‎ انجام بدیم میتونیم این Event رو هم براش تعریف کنیم و در در این Event مشخص کنید اگر کره باز شد به متغییر Count یکی اضافه و اگر بسته شد یکی کم کنه

اگر لطف کنید با یک نمونه کد مثال بزنید.

PetekDincos
چهارشنبه 04 آبان 1390, 15:48 عصر
با سلام
در CodeBehind به این صورت کد بالا رو تغییر بده


private void Button_Click(object sender, RoutedEventArgs e)
{
Count = 0;
foreach (TreeViewItem item in MyTreeView.Items)
{
OutputItems(item);
}
MessageBox.Show(Count.ToString());
}
private int Count = 0;
private void OutputItems(TreeViewItem item)
{
if (item.IsExpanded)
Count++;
foreach (TreeViewItem n in item.Items)
OutputItems(n);

}

با تشکر

water_lily_2012
پنج شنبه 05 آبان 1390, 13:07 عصر
دوست عزیز مشکل حل شد. فقط یک چیز دیگر.
چه طور می توانم متوجه بشم چه موقع کاربر یک node را باز کرده یا بسته. یعنی Event ی هست که بتونم در آنجا کد نویسی کنم که وقتی کاربر بر روی فلش expand یک گره کلیک می کنه متوجه بشوم.

water_lily_2012
پنج شنبه 05 آبان 1390, 13:50 عصر
مشکل این هم حل شد.
با کد زیر می توانید Expand و Collapsing را پیاده سازی کنید.

public class MyTreeViewItem : TreeViewItem
{
public static readonly RoutedEvent CollapsingEvent = EventManager.RegisterRoutedEvent("Collapsing", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyTreeViewItem));
public static readonly RoutedEvent ExpandingEvent = EventManager.RegisterRoutedEvent("Expanding", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyTreeViewItem));

public event RoutedEventHandler Collapsing
{
add { AddHandler(CollapsingEvent, value); }
remove { RemoveHandler(CollapsingEvent, value); }
}

public event RoutedEventHandler Expanding
{
add { AddHandler(ExpandingEvent, value); }
remove { RemoveHandler(ExpandingEvent, value); }
}

protected override void OnExpanded(RoutedEventArgs e)
{
OnExpanding(new RoutedEventArgs(ExpandingEvent, this));
base.OnExpanded(e);
}

protected override void OnCollapsed(RoutedEventArgs e)
{
OnCollapsing(new RoutedEventArgs(CollapsingEvent, this));
base.OnCollapsed(e);
}

protected virtual void OnCollapsing(RoutedEventArgs e) { RaiseEvent(e); }
protected virtual void OnExpanding(RoutedEventArgs e) { RaiseEvent(e); }
}