PDA

View Full Version : بهترین روش اضافه کردن صدها Control در یک Panel



mmbguide
جمعه 24 آذر 1402, 20:09 عصر
سلام خدمت دوستان

سوال من خیلی کلی هست. اضافه کردن یک Button به یک Control دیگه مثل Panel بسادگی انجام میشه. ولی اگر قرار باشه 1000 دکمه به Panel اضافه کنم بسیار کند انجام میشه و برنامه کند اجرا میشه. حالا فرض کنیم که یک UserControl ساختم که خودش از چندین Controlدرست شده و قرار هست حدود 1000 عدد از این UserControl در یک Panel اضافه کنم که قابلیت Scroll کردن هم داشته باشه. این کار برنامه را عملا از کا میندازه. برای چنین نیازی چه روشی مناسب هست؟ برای نمونه ComboBox و یا ListBox موجود در دات نت خیلی سریع کار میکنه ولی اگر قرار باشه همین LisBox را سفارشی ایجاد کنم برنامه خیلی کند اجرا میشه.

ممنون اگر راهنمایی کنید

ROSTAM2
شنبه 25 آذر 1402, 12:11 عصر
سلام خدمت دوستان

سوال من خیلی کلی هست. اضافه کردن یک Button به یک Control دیگه مثل Panel بسادگی انجام میشه. ولی اگر قرار باشه 1000 دکمه به Panel اضافه کنم بسیار کند انجام میشه و برنامه کند اجرا میشه. حالا فرض کنیم که یک UserControl ساختم که خودش از چندین Controlدرست شده و قرار هست حدود 1000 عدد از این UserControl در یک Panel اضافه کنم که قابلیت Scroll کردن هم داشته باشه. این کار برنامه را عملا از کا میندازه. برای چنین نیازی چه روشی مناسب هست؟ برای نمونه ComboBox و یا ListBox موجود در دات نت خیلی سریع کار میکنه ولی اگر قرار باشه همین LisBox را سفارشی ایجاد کنم برنامه خیلی کند اجرا میشه.

ممنون اگر راهنمایی کنید

سلام.
تاپیکی که ایجاذ کردی نمونه کد نداره.
اگ از Loops استفاده می کنی متود DoEvents از کلاس Application کمک می کنه هنگ نکنه...

mmbguide
شنبه 25 آذر 1402, 14:10 عصر
سلام خدمت شما

موضوع استفاده از DoEvents جهت آزاد سازی Thread و امثال اون نیست چون میشه در یک Thread جداگانه هم این کار رو انجام داد تا برنامه هنگ نکنه. بیشتر هدفم مقایسههستش و اینکه بتونم به راه حل برسم. برای مثال:

ListBox خود ویدوز چجوری هزاران آیتم را سریع نمایش میده؟
کنترل DataGridView چطور این همه سلول را نمایش میده؟
یا برنامه ای مثل Excel چطور براحتی میلیاردها سلول را نمایش میده؟


حالا در مقایسه با این موارد، چطور میشه یک کنترل با این ویژگی ایجاد کرد؟

تشکر

mazoolagh
شنبه 25 آذر 1402, 19:54 عصر
سلام و روز خوش

شاید خیلی مرتبط با خواسته شما نباشه،
ولی میتونین سورس کد کمپوننت های devexpress رو بررسی کنین ببینین برای کنترل های پیچیده چه کار کردن.
اگر هنوز دنبال ایجاد گانت چارت هستین یک کنترل scheduler داره که روی اون میتونین این چارت رو بسازین.

shahryari
یک شنبه 26 آذر 1402, 10:43 صبح
سلام ، "بهترین روش اضافه کردن صدها Control در یک Panel "
میتونی 10 تا 10 یا 20 تا 20 اضافه کنی وقتی مثلا پنلت اسکرول میشه و میرسه به پوزیشن آخرین کنترل ، مجدد 20 تای بعدی را اضافه کنی
یا حتی میتونی با کمی کد نویسی ریسایکل بکنی و اون کنترول هایی که در دید نیستن و حذف کنی و مجدد اونایی که در دیسپلی میشن رو مجدد ایجاد کنی (عملکرد ریسایکلر ویو در اندروید)
خلاصه (به قول یکی از دوستان) : روشهای سامورایی زیاده تا بخوای 1000 کنترول را به طبع در حلقه ایجاد کنی ، استفاده از ترد مجزا هم دردی را دوا نمیکنه
155150

mmbguide
یک شنبه 26 آذر 1402, 18:54 عصر
سلام. ممنون از پیشنهاد شما. حتما این روش را هم امتحان میکنم.


سلام ، "بهترین روش اضافه کردن صدها Control در یک Panel "
میتونی 10 تا 10 یا 20 تا 20 اضافه کنی وقتی مثلا پنلت اسکرول میشه و میرسه به پوزیشن آخرین کنترل ، مجدد 20 تای بعدی را اضافه کنی
یا حتی میتونی با کمی کد نویسی ریسایکل بکنی و اون کنترول هایی که در دید نیستن و حذف کنی و مجدد اونایی که در دیسپلی میشن رو مجدد ایجاد کنی (عملکرد ریسایکلر ویو در اندروید)
خلاصه (به قول یکی از دوستان) : روشهای سامورایی زیاده تا بخوای 1000 کنترول را به طبع در حلقه ایجاد کنی ، استفاده از ترد مجزا هم دردی را دوا نمیکنه
155150

mmbguide
یک شنبه 03 دی 1402, 21:59 عصر
سلام ، "بهترین روش اضافه کردن صدها Control در یک Panel "
میتونی 10 تا 10 یا 20 تا 20 اضافه کنی وقتی مثلا پنلت اسکرول میشه و میرسه به پوزیشن آخرین کنترل ، مجدد 20 تای بعدی را اضافه کنی


درود به شما. درخصوص پیشنهاد شما و راه حلی که یکی از مهندسین در لینکدین ارائه دادند نتیجه انجام کار بدین صورت شد.

https://www.linkedin.com/posts/hadimazaeei_%D9%86%D8%A7%D9%85-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B1%D9%88%D8%B4-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D8%B5%D8%AF%D9%87%D8%A7-control-activity-7141843367948185600-QOSr?utm_source=share&utm_medium=member_desktop

در واقع فقط یکبار کنترل ها اضافه میشوند و ثابت هستند ولی داده های جدید درزمان اسکرول جایگزین قبلیها می شوند.


1- ارزیابی انجام کار جهت نمایش 30 آیتم بوده است.
2- میزان حافظه اشغال شده توسط برنامه قبل از نمایش داده ها 13 مگابایت
3- میزان حافظه اشغال شده توسط برنامه بعد از نمایش داده ها 17 مگابایت
4- زمان تولید 1000 آیتم در یک لیست حدود 6 میلی ثانیه
5- افزودن 30 آیتم خالی در FlowLayoutPanel بصورت ثابت حدود 600 میلی ثانیه که در ابتدای برنامه یکبار انجام می شود و اگر rezise صورت بگیرد این تعداد اصلاح خواهد شد.
6- نمایش داده های موجود در لیست 1000 آیتمی در FlowLayoutPanel بصورت 30 تا 30 تا حدود 110 میلی ثانیه زمان می برد. داده ها با متد Take از لیست دریافت میشود.
7- نمایش 30 آیتم بعدی در FlowLayoutPanel حدود 15 میلی ثانیه. داده ها با متد Take از لیست دریافت میشود و به نوعی Skip کردن آیتم ها قابل تنظیم است.




باتشکر

mmbguide
یک شنبه 03 دی 1402, 22:00 عصر
با توجه به پیاده سازیراه حل و خروجی نسبتا مناسب، یک کنترل به پکیج تحت نام CesListBox اضافه شده که اطلاعات آن در آدرس زیر دردسترس می باشد:

https://barnamenevis.org/showthread.php?576995-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-%D9%87%D8%A7%DB%8C-Ces-WinForm-UI