1

我收到“错误呈现控件”错误,仅当我以设计模式将控件放置在 Web 窗体上时,如果我运行该页面,控件将正确显示。
上面的语句并不重要,发生这个错误是因为返回的工具栏对象为空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;                
}

工具栏返回 null!(在设计模式下)
但是当我运行页面时,工具栏会返回适当的数据。

如果您需要有关我的代码的更多信息,请询问。

更新:

它必须与程序集有关,如果我使用文件流而不是指定文件,它确实有效。

另一个更新:

我稍微修改了我的代码,并添加了“数据集”用于测试目的:

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),然后我创建一个新项目并添加控制一切正常。

4

1 回答 1

2

当您在 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;                
}

或者,您可以在调用代码中执行检查,但由于这是一个公共方法,因此无法保证所有调用者都会执行此检查,因此您最好在方法中进行。

最后一个选项是创建一个覆盖 LoadToolbarsFromConfigFile 方法并为您提供虚拟工具栏的 Designer 类。

于 2009-12-01T11:31:27.377 回答