در پست قبلی در خصوص ویژگی‌های کنترل CesComboBox مواردی عنوان شد ولی چند مساله وجود دارد که در نسخه 1.18.12 مرتفع شده‌اند.

کارکرد کنترل قبل از نسخه 1.18.12

  • بعد از تخصیص مقدار به CesDataSource به دلیل آنکه انتخاب قبلی null می‌شد، رویداد CesSelectionChanged فعال می‌شد.
  • اگر ویژگی CesKeepPreviousItem و یا CesSelectFirst فعال می‌بود، پس از تخصیص مقدار به کنترل، متد GoToValueMember از توسط کنترل بصورت خودکار اجرا می‌شد تا انتخاب قبلی کاربر را مجددا فعال کند و این کار باعث می‌شد که برای بار دوم رویداد CesSelectionChanged فعال شود.
  • در واقع اگر در یک برنامه قرار بود اطلاعاتی برمبنای یک آیتم از CesComboBox فراخوانی شود می‌بایست دوبار این اتفاق رخ میداد و برای برنامه هایی که باید یک درخواست API در وب را ارسال کنند مساله جالبی نبود (غیر از آن هم جالب نیست).


کارکرد کنترل در نسخه 1.18.12
مساله اول: در زمان تخصیص مقدار به CesDataSource اگر ویژگی‌های CesKeepPreviousItem و یا CesSelectFirst فعال باشند کنترل رویداد را فعال نخواهد کرد بلکه صدا زدن رویداد بعد از انتخاب آیتم قبلی کاربر و یا انتخاب اولین گزینه اتفاق خواهد افتاد. تا اینجا CesComboBox در کارکرد داخلی خودش اصلاح شده و در صورت لزوم رویداد را صدا می‌زند.

مساله دوم: فرض کنید بعد از اتمام بارگذاری اطلاعات در CesComboBox یک توسعه دهنده حسب نیاز پروژه جداولی که دارای ویژگی IsPinned باشند (تقریبا تمام جداول دارند) باید به عنوان گزینه‌ی دارای الویت، در حالت انتخاب قرار گیرد. بنابراین اقدام به انتخاب آیتمی خواهد کرد که IsPinned = true باشد. مرحله اول که دریافت و بارگذاری اطلاعات است رویداد CesSelectionChanged را اجرا خواهد کرد و آنچه که توسط توسعه دهنده می‌بایست حسب نیاز پروژه در حالت انتخاب باشد نیز رویداد CesSelectionChanged را مجدد اجرا خواهد کرد. باز هم در این سناریو فراخوانی اطلاعات تکراری وجود دارد.

حل مساله دوم: یک ویژگی جدید با نام CesStopSelcetionChangedEvent اضافه شده که اگر مقدار آن true باشد رویداد اجرا نخواهد شد و به محض اینکه مقدار آن false شود رویداد صدا زده خواهد شد. با این ویژگی میشه کاملا مطمئن بود که بعد از اجرای تمام سناریوها و حسب نیاز رویداد اجرا خواهد شد.


// توقف اجرای رویداد
control.CesStopSelectedItemChangedEvent = true;

// بارگذاری داده‌ها
// انجام سناریوهای مربوط به توسعه برنامه

//اجرای رویداد
control.CesStopSelectedItemChangedEvent = false;