变量'variable_name'要么未声明,要么从未分配过

问题描述 投票:31回答:13

我有一个与标题错误有关的问题。我正在使用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函数之前赋值。

我坚持这一点,不知道如何解决问题。希望你们中的一些人可以帮我解决这个问题。

c# .net winforms visual-studio-2010 windows-forms-designer
13个回答
35
投票

所以,我过去遇到了同样的问题,为了解决这个问题,我做了以下几点:

  • 解决方案→清洁溶液;
  • 构建→重建解决方案;
  • 关闭Visual Studio,重新打开。

非常感谢Marshall Belew!


1
投票

我正在使用Windows窗体中的WPF。

我在Windows窗体元素主机中托管了我的WPF用户控件。由于在调用InitializeComponent()时,我在到达WPF控件的InitializeComponent()之前执行了Code。棘手。

所以我把它从我的构造函数,Clean Build,Rebuild,Restart VS中移出来,一切都按预期工作。最后。


1
投票

在我的情况下,我在我的工具栏中添加了第三方控件(通过.dll文件),并在我的表单中绘制其中一个。由于某种原因,我的工具栏清除了一般组中的第三方控件(我将其添加到一般组中),因此VS无法找到此控件。这是我为解决这个问题所做的工作:

  1. 将此控件添加到工具栏中。
  2. 清洁解决方案
  3. 重建解决方案

如有必要,重绘控件。


1
投票

不要在构造函数中放置除InitializeComponent();之外的任何内容。您可以将代码放在像Load()这样的事件中。


0
投票

首先,我有一些代码引用了设计者无法加载的类型(无论出于何种原因)。然后我在构造函数中有代码无法从我的本地笔记本电脑执行。我决定最好的选择是将逻辑移动到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属性...


0
投票

将变量componentResourceManager重命名为资源解决错误。

不幸的是,我不得不改变大量其他项目,让设计师为Telerik报告设计师工作


0
投票

在我的解决方案中,我有错误的参考路径,我修复了.csproj文件。修复后,我终于可以再次加载表格。


10
投票

我遇到了这个错误,因为我的项目只是x64。显然,作为32位应用程序的Visual Studio无法在设计器中加载任何编译为64位的表单或控件。它完全有道理,但错误没有给出任何迹象表明问题。

请参阅the answerVisual studio designer in x64 doesn't work

解决方法是在设计时将项目更改为任何CPU,然后在构建时返回。


8
投票

可能由于您的构造函数代码而发生错误。将InitializeComponent();放在构造函数的开头,如下所示:

public FormularioGeneral()     
{         
    InitializeComponent();
    ConfigurarUI();         
    AccionesConstructor();
    PostInicializacionComponentes();         
    EstablecerIcono();         
    InicializarLocalizacionFormulario();     
} 

说明:

变量在该方法中初始化。


6
投票

在我的情况下,我有一个较旧的Windows窗体项目,其中InitializeComponents()像这样开始:

private void InitializeComponent()
{
    var componentResourceManager = new ComponentResourceManager(typeof(MyForm));
    ...

当访问componentResourceManager中的InitializeComponent()时,这会导致稍后出现错误消息:

变量'componentResourceManager'未声明或从未分配过。

当与新创建的表单进行比较时,我发现它与我的非工作表单类似,除了一件事:

该变量未命名为componentResourceManager,而仅仅是resources

在对我的变量进行重命名以使其名称为resources之后,一切正常。

Visual Studio 2017中的Windows窗体设计器确实正确打开了窗体。


3
投票

我有同样的问题,清洁和重建对我不起作用。

在我的情况下,问题是由Visual Studio设计器从GAC加载引用的DLL而不是从.csproj文件中指定的<HintPath>目录加载它们引起的。 GAC中的DLL与本地存储的DLL没有相同的版本。

当我更新GAC中的DLL以使其具有相同版本时,一切正常。


2
投票

当我的用户控件在构造函数中有一些与运行时资源相关的代码时,我遇到了这个问题。我添加了空检查并修复了。

        InitializeComponent();
        if (MyConfig!= null)
        {
            this.label2.Text = MyConfig.text1;
            this.label3.Text = MyConfig.text2;
            this.label1.Text = MyConfig.text3;
        }

2
投票

用户控件出现问题,在尝试了所有建议之后(Focus解决方案然后按Alt + Enter)将解决方案的平台目标从x64更改为任何CPU解决了问题。


1
投票

关于变量,您可以在声明中简单地初始化它们吗?即使您稍后更改了值,我认为这也足够了。从我所看到的,编译器无法检查是否已初始化它们,因为它不是直接在构造函数代码上,而是在虚拟方法上完成,该方法仅在运行时进行评估。

所以,而不是:

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


1
投票

在从表单构造函数调用的InitializeComponent()中创建第三方控件时,会发生此错误。当我在InitializeComponent()之后创建它时,它对我来说很好。

public MyForm() //Form constructor
{         
    InitializeComponent();

    //Create/initialize third party control here with new operator    
}
© www.soinside.com 2019 - 2024. All rights reserved.