我有一个与标题错误有关的问题。我正在使用c#和Visual Studio 2010。
我有一个声明为“公共类FormularioGeneral:Form”的表单,它是我的应用程序中其余表单的基础。当我尝试访问Designer视图时,我会多次出现此错误,如图所示:
所有错误都引用InitializeComponent方法中的行,其中值被赋予像这样的属性:
[...]
this.PanelMargenIzquierdoCapaBase.BackColor = m_ColorCapaBase;
[...]
但是所有变量都在与只读属性相同的类中声明,并且所有变量都在构造函数中调用的方法内分配。
财产声明:
protected Color m_VariableName;
public Color VariableName
{
get { return m_VariableName; }
set { }
}
构造函数代码:
public FormularioGeneral()
{
ConfigurarUI();
AccionesConstructor();
InitializeComponent();
PostInicializacionComponentes();
EstablecerIcono();
InicializarLocalizacionFormulario();
}
ConfigurarUI方法:
public virtual void ConfigurarUI()
{
[...]
m_AltoBordeSuperiorCapaBase = 30;
m_AltoBordeInferiorCapaBase = 7;
m_AnchoBordesLateralesCapaBase = 7;
m_ColorCapaBase = Color.FromArgb(50, 100, 150);
m_ColorTextoCapaBase = Color.White;
m_ColorTextoBotonAplicacion = Color.Black;
m_FuenteTextoIzquierdoCapaBase = new System.Drawing.Font("Verdana", 11.0F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
m_FuenteTextoCentroCapaBase = new System.Drawing.Font("Verdana", 14.0F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
[...]
}
所以,据我所知,所有给出错误的变量都被正确声明,并在调用InitilizeComponent函数之前赋值。
我坚持这一点,不知道如何解决问题。希望你们中的一些人可以帮我解决这个问题。
我正在使用Windows窗体中的WPF。
我在Windows窗体元素主机中托管了我的WPF用户控件。由于在调用InitializeComponent()时,我在到达WPF控件的InitializeComponent()之前执行了Code。棘手。
所以我把它从我的构造函数,Clean Build,Rebuild,Restart VS中移出来,一切都按预期工作。最后。
在我的情况下,我在我的工具栏中添加了第三方控件(通过.dll文件),并在我的表单中绘制其中一个。由于某种原因,我的工具栏清除了一般组中的第三方控件(我将其添加到一般组中),因此VS无法找到此控件。这是我为解决这个问题所做的工作:
如有必要,重绘控件。
不要在构造函数中放置除InitializeComponent();
之外的任何内容。您可以将代码放在像Load()
这样的事件中。
首先,我有一些代码引用了设计者无法加载的类型(无论出于何种原因)。然后我在构造函数中有代码无法从我的本地笔记本电脑执行。我决定最好的选择是将逻辑移动到Load事件并检查组件是否在DesignMode中,如果是,则退出。
即使这对我来说还不够,因为设计师仍然试图JIT后来在该方法中使用的类型,所以我不得不将其移出一个单独的方法来阻止它发生。这基本上是我最终得到的:
private void userControl_Load(object sender, EventArgs e)
{
if (DesignMode) return;
Initialize();
}
private void Initialize()
{
// do your work
}
特别感谢this SO answer,它指出我在博客文章中发表评论,关于在您进入Load事件之前不访问DesignMode属性...
将变量componentResourceManager重命名为资源解决错误。
不幸的是,我不得不改变大量其他项目,让设计师为Telerik报告设计师工作
在我的解决方案中,我有错误的参考路径,我修复了.csproj文件。修复后,我终于可以再次加载表格。
我遇到了这个错误,因为我的项目只是x64。显然,作为32位应用程序的Visual Studio无法在设计器中加载任何编译为64位的表单或控件。它完全有道理,但错误没有给出任何迹象表明问题。
请参阅the answer到Visual studio designer in x64 doesn't work。
解决方法是在设计时将项目更改为任何CPU,然后在构建时返回。
可能由于您的构造函数代码而发生错误。将InitializeComponent();
放在构造函数的开头,如下所示:
public FormularioGeneral()
{
InitializeComponent();
ConfigurarUI();
AccionesConstructor();
PostInicializacionComponentes();
EstablecerIcono();
InicializarLocalizacionFormulario();
}
说明:
变量在该方法中初始化。
在我的情况下,我有一个较旧的Windows窗体项目,其中InitializeComponents()
像这样开始:
private void InitializeComponent()
{
var componentResourceManager = new ComponentResourceManager(typeof(MyForm));
...
当访问componentResourceManager
中的InitializeComponent()
时,这会导致稍后出现错误消息:
变量'componentResourceManager'未声明或从未分配过。
当与新创建的表单进行比较时,我发现它与我的非工作表单类似,除了一件事:
该变量未命名为componentResourceManager
,而仅仅是resources
。
解
在对我的变量进行重命名以使其名称为resources
之后,一切正常。
Visual Studio 2017中的Windows窗体设计器确实正确打开了窗体。
我有同样的问题,清洁和重建对我不起作用。
在我的情况下,问题是由Visual Studio设计器从GAC加载引用的DLL而不是从.csproj文件中指定的<HintPath>目录加载它们引起的。 GAC中的DLL与本地存储的DLL没有相同的版本。
当我更新GAC中的DLL以使其具有相同版本时,一切正常。
当我的用户控件在构造函数中有一些与运行时资源相关的代码时,我遇到了这个问题。我添加了空检查并修复了。
InitializeComponent();
if (MyConfig!= null)
{
this.label2.Text = MyConfig.text1;
this.label3.Text = MyConfig.text2;
this.label1.Text = MyConfig.text3;
}
用户控件出现问题,在尝试了所有建议之后(Focus解决方案然后按Alt + Enter)将解决方案的平台目标从x64更改为任何CPU解决了问题。
关于变量,您可以在声明中简单地初始化它们吗?即使您稍后更改了值,我认为这也足够了。从我所看到的,编译器无法检查是否已初始化它们,因为它不是直接在构造函数代码上,而是在虚拟方法上完成,该方法仅在运行时进行评估。
所以,而不是:
protected Color m_VariableName;
public Color VariableName
{
get { return m_VariableName; }
set { }
}
做:
protected Color m_VariableName = Color.White; // Or null
public Color VariableName
{
get { return m_VariableName; }
set { }
}
并注释:您应该避免构造函数中的虚拟调用,这可能会导致应用程序中出现模糊错误。检查它here。
在从表单构造函数调用的InitializeComponent()中创建第三方控件时,会发生此错误。当我在InitializeComponent()之后创建它时,它对我来说很好。
public MyForm() //Form constructor
{
InitializeComponent();
//Create/initialize third party control here with new operator
}