کند بودن کمبوباکس ستونی هنگام باز شدن لیست آن در دیتاگرید WPF
یه دیتا گرید دارم که از دیتابیس پر میشه و یه ستونی از نوع 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>
پاسخ هوش مصنوعی
برای حل مشکل کندی کمبوباکس در DataGridComboBoxColumn
، نکته ای که معمولاً به آن توجه نمی شود این است که در ستون کمبوباکس امکان استفاده از تنظیمات ItemsPanel
مشابه آنچه در DataGridTemplateColumn
وجود دارد وجود ندارد.
به جای این کار، شما می توانید از یک ObservableCollection
استفاده کنید، تا به صورت داینامیک ستون کمبوباکس را پر کنید و فقط زمانی که کاربر بر روی آن کلیک می کند، داده ها را بارگذاری کنید. اینگونه می توانید احساسی مشابه با VirtualizingStackPanel
به دست آورید.
اینجا یک روش پیشنهادی برای پیاده سازی این کار است:
public ObservableCollection FilteredCommodities { get; set; }
public YourViewModel()
{
FilteredCommodities = new ObservableCollection();
}
private void OnComboBoxExpanded()
{
if (FilteredCommodities.Count == 0)
{
// فرض کنید GetCommoditiesFromDatabase متدی است که داده ها را از پایگاه داده می خواند
var allCommodities = GetCommoditiesFromDatabase();
foreach (var commodity in allCommodities)
{
FilteredCommodities.Add(commodity);
}
}
}
سپس در XAML برای DataGridComboBoxColumn
، شما می توانید ComboBox
را به گونه ای تغییر دهید که به رویداد Expanded
آن متصل شود:
این روش می تواند به شدت به بهبود عملکرد کمک کند، چون فقط زمانی که کاربر نیاز دارد، داده ها بارگذاری می شوند.
اگر کند بودن در حد یک مکث یا 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>
من تست کردم حل شد.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول