我收到“错误呈现控件”错误,只有当我将控件放在设置模式的webform上时才会出现错误,如果我运行页面控件显示正确。
上述语句并不重要,发生此错误是因为返回的工具栏对象为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;
}
工具栏返回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),那么我创建了一个新项目并添加控件一切正常。
答案 0 :(得分: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;
}
或者,您可以在调用代码中执行检查,但由于这是一个公共方法,因此不能保证所有调用者都会执行此检查,因此您最好在方法中执行此操作。
最后一个选项是create a Designer class,它会覆盖LoadToolbarsFromConfigFile方法并为您提供虚拟工具栏。