Я получаю ошибки при просмотре форм в конструкторе - как я могу избежать этого? - PullRequest
1 голос
/ 06 февраля 2009

Некоторые из моих форм показывают ошибки, когда я загружаю их в конструктор. Это потому, что в своих конструкторах они используют системные настройки, загруженные из файла конфигурации. Когда форма загружается в конструктор, она использует какой-то случайный путь, и неудивительно, что файл конфигурации отсутствует.

например. Не удалось найти файл конфигурации C: \ Documents and Settings \ Rory \ Local Settings \ Application Data \ Microsoft \ VisualStudio \ 8.0 \ ProjectAssemblies \ it3dtcgg01 \ PrioryShared.dll.config.

Можно ли как-то справиться с этим, чтобы форма правильно отображалась в конструкторе? например:

if (!inDesignerMode) 
{ 
    loadSettingsFromConfigFile();
}

UPDATE: хорошо, я все еще получаю эту ошибку. Композиция такая:

  • MyForm.cs

    • MyCustomControl.cs

В конструкторе MyCustomControl я поместил

if (!this.DesignMode)
{
    // Get settings from config file   <- this is where the error occurs
}

но именно в этой строке я все еще получаю ошибку в конструкторе. Что дает?

ОБНОВЛЕНИЕ: стоит отметить эту ссылку , которая описывает, как отлаживать элементы управления во время разработки.

UPDATE: Control.DesignMode не устанавливается в true при вызове в конструкторе ( MSDN ) объекта! Такого рода код должен идти в onLoad. В качестве альтернативы вы можете использовать такой подход, как this

Ответы [ 6 ]

4 голосов
/ 06 февраля 2009

Как насчет простого помещения этой логики вместо OnLoad и проверки DesignMode?

protected override void OnLoad(System.EventArgs e)
{
    base.OnLoad(e);
    if (!this.DesignMode)
    {
        /* do stuff */
    }        
}
2 голосов
/ 06 февраля 2009

Вы должны обернуть элементы в чек на this.DesignMode, который установлен в true в конструкторе, или переместить их в OnLoad или в другое место, которое не вызывается во время использования в конструкторе.

1 голос
/ 06 февраля 2009

Кроме того, вы можете сделать что-то вроде этого:

public bool IsDesignMode
{
   get
      {
         return (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
      }
}
0 голосов
/ 10 апреля 2009

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

0 голосов
/ 09 апреля 2009

Это то, что я делаю, когда мне нужно выполнить некоторую специальную обработку, если элемент управления в настоящее время используется конструктором.


public MyControl() {
  InitializeComponent();
  if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)  {
    // Put stuff here that should not be run while in the designer
  }
}
0 голосов
/ 06 февраля 2009
Page.DesignMode

Это можно использовать на всех страницах и в пользовательских элементах управления.

...