.NET правила времени проектирования Windows Forms

Почему бы не создать еще один свернутый массив внутри $allgroupResult для каждой категории, имея такую ​​структуру:

array(1) {
  [0] =>
  array(4) {
    'category_code' =>
    string(13) "category_code"
    'category_name' =>
    string(13) "category_name"
    'category_desc' =>
    string(13) "category_desc"
    'skus' =>
    array(3) {
      [0] =>
      string(4) "sku1"
      [1] =>
      string(4) "sku2"
      [2] =>
      string(4) "sku3"
    }
  }
}

, и тогда вы можете просто сделать count($item['skus']) всякий раз, когда вам нужно получить количество продуктов в каждой категории. Чтобы сделать это, попробуйте следующую модификацию вашего цикла foreach:

foreach($prices->groups as $group){
    $groupItem = array();
    $groupItem["category_code"] = $group->category_code;
    $groupItem["category_name"] = $group->category_name;
    $groupItem["category_desc"] = $group->category_desc;

    $groupItem["skus"] = array();

    foreach($group->skus as $sku){
        $skuItem = array();
        $skuItem["item_code"] = $sku->sku_info->item->item_code;
        $skuItem["identifier"] = $sku->sku_info->identifier;

        foreach($sku->prices as $price => $amount){
            $skuItem[] = $amount;
        }

        $skuItem[] = strip_tags(html_entity_decode($sku->sku_info->item->desc));

        foreach ($sku->sku_info->details as $details) {

            $skuItem[] = $details->details1;
            $skuItem[] = $details->details2;
            $skuItem[] = $details->details3;

        }

        $groupItem["skus"][] = $skuItem;
    }

    $allgroupResult[] = $groupItem;
}
10
задан Peter Mortensen 30 December 2011 в 18:18
поделиться

3 ответа

Можно проверить UsageMode LicenseManager, чтобы проверить, находится ли код во время проектирования или нет.

Система. ComponentModel. LicenseManager. UsageMode == система. ComponentModel. LicenseUsageMode. Время проектирования

Вот быстрый пример:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Test
{
    public class ComponentClass : Component
    {
        public ComponentClass()
        {
            MessageBox.Show("Runtime!");
        }
    }
}

Когда этот компонент добирается, добавляют к Вашей форме в разработчике, Вы будете immediatly получать окно сообщения.

Для предотвращения этого, можно добавить простое, если оператор, чтобы проверить, не находится ли код во время проектирования

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Test
{
    public class ComponentClass : Component
    {
        public ComponentClass()
        {
            if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
            {
                MessageBox.Show("Runtime!");
            }
        }
    }
}

После добавления, если оператор, messagebox больше не появляется, когда компонент добавляется к форме через разработчика.

Я надеюсь, что это помогает.

- jeremy

11
ответ дан 3 December 2019 в 15:53
поделиться

Существуют некоторые вещи, которые Вы не должны делать с разработчиком. У меня нет веского доказательства, но я нашел, что разработчик Windows Forms ненавидит его, когда Вы убираете конструктора по умолчанию из него. Просто идите вперед и создайте новые перегрузки, но оставьте пустого конструктора на месте.

Также постарайтесь не делать Form_Load события в базовых классах Вы наследовались.

0
ответ дан 3 December 2019 в 15:53
поделиться

Вы также можете использовать это, чтобы проверить, запускает ли Visual Studio Designer код:

public static bool DesignMode
{
    get {  return (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv"); }
}

Затем в Form_Load:

if (!DesignMode)
{
    // Run code that breaks in Visual Studio Designer (like trying to get a DB connection)
}

Однако это менее элегантно, чем использование LicensManager .UsageMode , но он работает (пока Microsoft не изменит имя процесса, под которым работает Visual Studio).

2
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: