من میخوام توی WPF یک دیتاگرید داشته باشم که بتونم به صورت سلسلهمراتب درختی اون رو نمایش و عملیات درج - ویرایش و حذف رو انجام بدم :
درست مثل این فیلم :
بهترین راه برای پیاده سازی عین این موضوع در WPF چی هستش ؟
باتشکر
ویرایش
من سعی کردم با استفاده از این مثال این کار رو انجام بدم :
XAML:
<DataGrid Visibility="Visible" ItemsSource="{Binding Employees}" SelectedItem="{Binding SelectedEmployee}" >
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<Expander Expanded="Expander_Expanded" Height="20" Collapsed="Expander_Collapsed" Header="جزییات" >
</Expander>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Details}"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
#C:
public Window3()
{
InitializeComponent();
var detail1 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Ali", ManagerMobile = "123456" };
var detail2 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
var detail3 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };
var detail4 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Ali", ManagerMobile = "123456" };
var detail5 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
var detail6 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };
var detail7 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Ali", ManagerMobile = "123456" };
var detail8 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
var detail9 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };
var details1 = new List<EmployeeDetails>();
details1.Add(detail1);
details1.Add(detail2);
details1.Add(detail3);
var details2 = new List<EmployeeDetails>() { detail4, detail5, detail6 };
var details3 = new List<EmployeeDetails>() { detail7, detail8, detail9 };
Employees = new List<Employee>();
Employees.Add(new Employee() { ID = 1, Name = "Name1", Details = details1 });
Employees.Add(new Employee() { ID = 2, Name = "Name2", Details = details2 });
Employees.Add(new Employee() { ID = 3, Name = "Name3", Details = details3 });
SelectedEmployee = Employees[1];
this.DataContext = this;
}
public List<Employee> Employees { get; set; }
private Employee _selected;
public Employee SelectedEmployee
{
get { return _selected; }
set { _selected = value; }
}
#region ExpandOnClick
private void Expander_Expanded(object sender, RoutedEventArgs e)
{
for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
if (vis is DataGridRow)
{
var row = (DataGridRow)vis;
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
break;
}
}
private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
if (vis is DataGridRow)
{
var row = (DataGridRow)vis;
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
break;
}
}
#endregion
}
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public List<EmployeeDetails> Details { get; set; }
}
public class EmployeeDetails
{
public int ManagerID { get; set; }
public string ManagerName { get; set; }
public string ManagerMobile { get; set; }
}
Result :
حالا مشکل این روش اینه که به طرز جالبی اگر به RowDetail اسم بدم , هیچ شکلی بهش دسترسی ندارم !
جواب :
<DataGrid x:Name="MainDGR1" Visibility="Visible" LoadingRowDetails="MainDGR1_LoadingRowDetails" ItemsSource="{Binding Employees}" SelectedItem="{Binding SelectedEmployee}" Loaded="MainDGR1_Loaded" >
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<Expander Expanded="Expander_Expanded" Height="20" Collapsed="Expander_Collapsed" Header="جزئیات" >
</Expander>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid x:Name="DetailDGR2" ItemsSource="{Binding Details}"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
از این رویداد باید اقدام کنید برای دسترسی : private void MainDGR1_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
DataGrid innerGrid = e.DetailsElement as DataGrid;
if (innerGrid != null)
{
}
DataGrid countries = e.DetailsElement.FindName("DetailDGR2") as DataGrid;
سپاس گزارم , سورس خدمت شما : WPF Row Detail
تاریخ :
1403/01/29
- ساعت :
08:08:00 AM
- بازدید :
192
- پاسخ :
2
|
تاریخ :
1403/01/12
- ساعت :
05:36:00 PM
- بازدید :
212
- پاسخ :
1
|
تاریخ :
1403/01/19
- ساعت :
03:06:00 PM
- بازدید :
207
- پاسخ :
1
|
تاریخ :
1402/10/30
- ساعت :
05:11:00 PM
- بازدید :
452
- پاسخ :
1
|
تاریخ :
1402/09/20
- ساعت :
03:39:00 PM
- بازدید :
567
- پاسخ :
2
|
تاریخ :
1402/09/06
- ساعت :
03:03:00 PM
- بازدید :
516
- پاسخ :
1
|
تاریخ :
1402/10/06
- ساعت :
01:28:00 AM
- بازدید :
586
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
369
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
698
- پاسخ :
1
|
تاریخ :
1398/07/25
- ساعت :
09:37:00 PM
- بازدید :
3511
- پاسخ :
5
|
تاریخ :
1403/01/29
- ساعت :
08:08:00 AM
- بازدید :
192
- پاسخ :
2
|
تاریخ :
1403/02/29
- ساعت :
06:34:00 PM
- بازدید :
23
- پاسخ :
0
|
تاریخ :
1403/02/24
- ساعت :
04:40:00 PM
- بازدید :
76
- پاسخ :
2
|
تاریخ :
1403/02/23
- ساعت :
02:24:00 PM
- بازدید :
123
- پاسخ :
5
|
تاریخ :
1403/02/25
- ساعت :
04:38:00 PM
- بازدید :
75
- پاسخ :
1
|
تاریخ :
1403/02/16
- ساعت :
01:25:00 PM
- بازدید :
167
- پاسخ :
4
|
تاریخ :
1403/02/20
- ساعت :
06:33:00 PM
- بازدید :
100
- پاسخ :
1
|
تاریخ :
1403/01/17
- ساعت :
08:30:00 PM
- بازدید :
284
- پاسخ :
3
|
تاریخ :
1401/11/15
- ساعت :
11:17:00 AM
- بازدید :
1220
- پاسخ :
1
|
تاریخ :
1402/04/01
- ساعت :
06:17:00 PM
- بازدید :
1171
- پاسخ :
0
|