یه دیتا گرید دارم که از دیتابیس پر میشه و یه ستونی از نوع DataGridComboBoxColumn که این ستون هم یکبار آییتم هاش (لیستی که قرار در هنگام باز شدن نمایش بده) فقط یکبارد در لود از جدول مشتریان که تعداد مشتریان 24000 هزار تا سطر هست لود میشه
من این موضوع رو در DataGridTemplateColumn
حلش کردم به این شکل :
<DataGridTemplateColumn Header="ComboBox Element" Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="ComboBox_Commodity" ItemsSource="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedValue="{Binding CommodityID}"
DisplayMemberPath="CommodityName"
SelectedValuePath="CommodityCode"
IsTextSearchEnabled="True"
IsEditable="True"
SelectedIndex="0" BorderBrush="#FFADEEB4" Background="{x:Null}" BorderThickness="1" PreviewLostKeyboardFocus="ComboBox_Commodity_PreviewLostKeyboardFocus">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
ولی نمیخوام از DataGridTemplateColumn
استفاده کنم چون وقتی که از این نوع داخل دیتاگرید مبذارید وقتی تغیری توی کمبوباکس میدید دیگه توی رویداد های دیتا گرید مثلا رویداد CellEndEdit نمیاد یعنی جدا میشه
برای همین اومدم سراغ DataGridComboBoxColumn (ستون کمبوباکسی) و الان میخوام از این استفاده کنم :
<DataGridComboBoxColumn Width="160" Header="DataGridComboBoxColumn"
SelectedValueBinding="{Binding CommodityID}"
DisplayMemberPath="CommodityName"
SelectedValuePath="CommodityCode">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
<Setter Property="SelectedIndex" Value="0"/>
<Setter Property="IsEditable" Value="True"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
تنظیماتی که برای رفع کندی و افزایش سرعت کمبوباکس توی DataGridTemplateColumn
انجام دادم رو دقیقا برای DataGridComboBoxColumn انجام دادم ولی مشکل کندی برای این رفع نشده
اصل کد برای رفع کندی کمبوباکس اینه که برای کمبوباکس ستونی کار نمیکنه ! :
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
لینک های مرتبط :
- Optimizing performance: Control
- Combox column in wpf datagrid performance issue
- WPF ComboBox performance problems by binding a large collections
- Why ComboBox be dropdown result whole app performance to very slow?
- Why is the ComboBoxColumn very slow on drop-down open in DataGrid WPF?
هیچکدام به من کمک نکرد
لطفا راهنماییم کنید
باتشکر از همگی
بروز رسانی :
این تنظیم برای ستون کمبوباکس کار نمیکنه ! در حالی که توی کمبوباکس داخل DataGridTemplateColumn به راحتی اوکی شد و مشکل کندی رفع شد اما در ComboBoxColumn نه !
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
<Setter Property="SelectedIndex" Value="0"/>
<Setter Property="IsEditable" Value="True"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
اگر کند بودن در حد یک مکث یا leg هست که قابل چشم پوشی هست. اما اگر حالت هنگ به خودش میگیره باید ببینید کجا این هنگی به وجود می یاد. شما 2 جا رو با Breakpoint بررسی کنید. اول اون کوئری که اطلاعات رو از دیتابیس واکشی میکنه و درون متغیر میریزه و دوم اونجایی که داده های درون متغیر رو میخواید به DataSource بدید. اگر خود کوئری کند هست شاید بشه با ترفندهایی مثل استفاده از IEnumerable یا IQueryable سرعت رو بهبود داد.
فرق بین IEnumerable و IQueryable
اگر هم کندی وقتی هست که اطلاعات رو درون DataSource میریزید بنظرم بهتره همه اطلاعات رو از دیتابیس واکشی نکنید. مثلا میتونید فقط 100 تا رکورد رو واکشی کنید و قابلیت جستجو برای کاربر قرار بدید. چون مطمئنا کاربر همه اطلاعات رو یه جا نیازی نداره.
var query = _context.Customer_Tbl.ToList().Take(100);
دوستان راه حلش اینه :
<Window.Resources>
<ItemsPanelTemplate x:Key="VSP">
<VirtualizingStackPanel IsVirtualizing="True" VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</Window.Resources>
و برای استفاده :
<DataGridComboBoxColumn x:Name="COMP_COD" Width="220" Header=" تماس گیرنده "
SelectedValueBinding="{Binding hes}"
DisplayMemberPath="NAME"
SelectedValuePath="hes">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.HES_COMBO_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.HES_COMBO_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
<Setter Property="ItemsPanel" Value="{StaticResource VSP}" />
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
من تست کردم حل شد.
تاریخ :
1399/11/25
- ساعت :
11:22:00 AM
- بازدید :
3896
- پاسخ :
2
|
تاریخ :
1403/12/02
- ساعت :
12:09:00 AM
- بازدید :
270
- پاسخ :
1
|
تاریخ :
1398/07/08
- ساعت :
12:21:00 AM
- بازدید :
3049
- پاسخ :
2
|
تاریخ :
1403/11/23
- ساعت :
08:24:00 PM
- بازدید :
191
- پاسخ :
2
|
تاریخ :
1399/11/10
- ساعت :
10:01:00 PM
- بازدید :
7167
- پاسخ :
4
|
تاریخ :
1399/04/09
- ساعت :
08:51:00 PM
- بازدید :
3096
- پاسخ :
1
|
تاریخ :
1399/03/25
- ساعت :
08:58:00 PM
- بازدید :
3829
- پاسخ :
1
|
تاریخ :
1398/10/03
- ساعت :
10:47:00 PM
- بازدید :
5337
- پاسخ :
8
|
تاریخ :
1400/12/18
- ساعت :
10:24:00 AM
- بازدید :
2111
- پاسخ :
1
|
تاریخ :
1401/01/26
- ساعت :
12:14:00 PM
- بازدید :
3002
- پاسخ :
1
|
تاریخ :
1404/01/07
- ساعت :
05:02:00 AM
- بازدید :
90
- پاسخ :
1
|
تاریخ :
1402/04/28
- ساعت :
09:04:00 PM
- بازدید :
1314
- پاسخ :
0
|
تاریخ :
1403/12/30
- ساعت :
06:43:00 PM
- بازدید :
66
- پاسخ :
1
|
تاریخ :
1398/08/23
- ساعت :
09:16:00 PM
- بازدید :
9852
- پاسخ :
1
|
تاریخ :
1404/01/03
- ساعت :
12:18:00 PM
- بازدید :
38
- پاسخ :
1
|
تاریخ :
1404/01/03
- ساعت :
10:39:00 AM
- بازدید :
46
- پاسخ :
1
|
تاریخ :
1404/01/02
- ساعت :
05:05:00 PM
- بازدید :
60
- پاسخ :
1
|
تاریخ :
1403/12/30
- ساعت :
06:52:00 PM
- بازدید :
48
- پاسخ :
1
|
تاریخ :
1399/06/04
- ساعت :
02:25:00 PM
- بازدید :
4420
- پاسخ :
2
|
تاریخ :
1403/11/30
- ساعت :
10:36:00 AM
- بازدید :
202
- پاسخ :
2
|