دسته بندی ها
14:28 1401/04/01

نحوه ایجاد دیتاگرید درختی (Visual Editable Tree DataGrid) در WPF

مشخصات سوال کننده :
کاربر : mojtabahakimian     امتیاز کاربر : 155     رتبه کاربر : 10
دسته بندی : سی شارپ WPF

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2387
هوش مصنوعی

پاسخ هوش مصنوعی

برای ایجاد یک دیتاگرید درختی (Visual Editable Tree DataGrid) در WPF، می توانید از نحوه ای مشابه با کد شما استفاده کنید، همراه با چند تغییر برای مدیریت بهتر جزییات ردیف. به طور خاص، به شما پیشنهاد می کنم از RowDetailsTemplate به نحوی استفاده کنید که بتوانید به آن دسترسی داشته باشید و عملیات ویرایش را انجام دهید.

در کد XAML خود، مطمین شوید که RowDetailsTemplate شامل یک دیتاگرید است که به جزییات مربوطه متصل می شود:

<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}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Manager ID" Binding="{Binding ManagerID}" />
                    <DataGridTextColumn Header="Manager Name" Binding="{Binding ManagerName}" />
                    <DataGridTextColumn Header="Manager Mobile" Binding="{Binding ManagerMobile}" />
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

در سمت کد C#، هیچ تغییر خاصی در اصل وجود ندارد، اما مطمین شوید که می توانید جزییات را به روز کنید.

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 = 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 = Visibility.Collapsed;
            break;
        }
}

همچنین می توانید با ایجاد یک دسترسی جداگانه برای ویرایش درون RowDetailsTemplate، کنترل بهتری بر روی ردیف های جزیی داشته باشید. این به شما این امکان را می دهد که تغییرات را به راحتی پیاده سازی کرده و از آن ها بهره برداری کنید.

نکته: مطمین شوید که با استفاده از Binding مناسب و PropertyChanged در کلاس های خود، هر تغییری را که در جزییات مورد نظر ایجاد می کنید با UI به روزرسانی کنید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : mojtabahakimian 23:41 1401/04/03

جواب : 

     <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;

 

ویرایش شده در یکشنبه 5 تیر 1401 ساعت 02:04:46
به این پاسخ امتیاز بدهید    1
امتیاز: 155 رتبه: 10
2 نظر
saedbfd : تشکر بابت پاسخی که قرار دادید. سوال شما در حوزه wpf تخصصی هست و شاید کمتر برنامه نویسی سر و کار داشته با این چالش. اگر میشد یک سورس هم به عنوان نمونه قرار می دادید خیلی عالی می شد.

امتیاز کاربر : 1664   رتبه کاربر : 1   تاریخ ثبت : 00:03 1401/04/04
mojtabahakimian : ولی برام سواله گه چرا از این مدل کار ها رو که میشه توی ابزار های دیگه راحت انجام داد , برای WPF که از همه بزرگتر و گسترده تره کار رو اینقدر پیچوندنش ! چرا مایکروسافت ابزار های آماده ای برای کار با WPF نداده

امتیاز کاربر : 155   رتبه کاربر : 10   تاریخ ثبت : 08:32 1401/04/04
پاسخ دهنده : mojtabahakimian 08:27 1401/04/04

سپاس گزارم , سورس خدمت شما : WPF Row Detail

ویرایش شده در یکشنبه 5 تیر 1401 ساعت 02:03:20
به این پاسخ امتیاز بدهید    1
امتیاز: 155 رتبه: 10
1 نظر
saedbfd : تشکر . بله در WPF امکانات بسیار جذاب و خوبی هست اما متاسفانه کامپوننت هایی که در ویژوال استودیو وجود داره بسیار کامپوننت های ساده ای هست و استفاده از قابلیتهای جذاب WPF رو بسیار پیچیده کرده و همین موضوع باعث دلسردی خیلیا میشه. ضمنا داکیومنت معتبر و خوبی هم برای قابلیتهای جذاب WPF موجود نیست.

امتیاز کاربر : 1664   رتبه کاربر : 1   تاریخ ثبت : 02:05 1401/04/05
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود