Композитный контроль и десериализация XML при ошибке времени разработки - PullRequest
1 голос
/ 26 ноября 2009

Я получаю ошибку «Ошибка рендеринга элемента управления», которая возникает, только когда я помещаю элемент управления в веб-форму в режиме desgin, если я запускаю страницу, элемент управления отображается правильно.
Вышеприведенный оператор не важен, эта ошибка возникает из-за того, что возвращенный объект панели инструментов имеет значение nul l.

После отладки проблема заключается в функции, которая вызывается из CeateChildControls ():

public static ToolBars LoadToolbarsFromConfigFile()
{

      ToolBars toolbars;
      Assembly executingAssembly = Assembly.GetExecutingAssembly();
      string resource = "Editor.ConfigFiles.ToolBars.xml";
      using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
      {
            XmlSerializer serializer = new XmlSerializer(typeof(ToolBars));
            toolbars = (serializer.Deserialize(stream)) as ToolBars;

      }
      return toolbars;                
}

панель инструментов возвращает ноль! (в режиме дизайна)
Но когда я запускаю страницу, панели инструментов возвращают соответствующие данные.

Если вам нужна дополнительная информация о моем коде, пожалуйста, спросите.

Обновление:

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

Другое ОБНОВЛЕНИЕ:

Я немного изменил свой код и добавил «набор данных» для целей тестирования:

using (DataSet ds = new DataSet())
{               
    ds.ReadXml(typeof(TheEditor).Assembly.GetManifestResourceStream("Editor.ConfigFiles.ToolBars.xml"));
    //show message box to see if it works
    System.Windows.Forms.MessageBox.Show(ds.Tables.Count.ToString());    
}     

Еще одна вещь, которую я заметил, все вышеизложенное происходит, когда я добавляю свой элемент управления в новый проект веб-сайта, но если я установил свойство отладки проекта элемента управления для запуска внешней программы (я запускаю Visual Studio), и там я создаю новый проект. и добавить элемент управления все работает.

1 Ответ

2 голосов
/ 01 декабря 2009

Когда вы запускаете это в Visual Studio, у вас нет контекста приложения, и поэтому вы не можете «GetExecutingAssembly» на нем - или, точнее, исполняющей сборкой является devenv.exe, а это есть ресурсы, которые вы ищете.

Вы можете использовать свойство DesignMode элемента управления, чтобы проверить и увидеть, визуализируете ли вы элемент управления в Visual Studio, и соответствующим образом изменить свое поведение:

public static ToolBars LoadToolbarsFromConfigFile()
{
  ToolBars toolbars;
  if (!DesignMode)
  {
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    string resource = "Editor.ConfigFiles.ToolBars.xml";
    using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
    {
      XmlSerializer serializer = new XmlSerializer(typeof(ToolBars));
      toolbars = (serializer.Deserialize(stream)) as ToolBars;
    }
  }
  else
  {
    // Load a dummy toolbar here.
  }
  return toolbars;                
}

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

Последним вариантом будет создание класса Designer , который переопределяет метод LoadToolbarsFromConfigFile и предоставляет вам фиктивную панель инструментов.

...