关于c#:got error变量< variable name>

got error The variable <variable name> is either undeclared or was never assigned

我使用Visual Studio 2008在WinForms C中实现了一个大表单。在对话框的很大一部分正常工作之后,当我试图打开设计器时,它开始显示标题中的许多错误massege。

"The variable is either undeclared or was never assigned"

我得到了很多以前很好的控制。我认为它发生在我使用的自定义控件中


第一推荐使用任何复杂的逻辑是do not in the form构造函数,but the s Load事件中的组织(或overrides of the onLoad方法)。P></

设计师uses the the to the构造函数代码的形式显示,如果你有你的form errors"undisplayable will be the VS设计师"。P></

每一个问题时,你secondly,设计师在the Close,EN和重建你的组织的项目。verify the errors & the error WARNINGS在列表窗口。后固定它,在你的desig reopen形态模式。P></


解决方案:在工作中发现的P></

当我初发生的问题the custom and the Controls对话框的DLL是在the same /项目/组合。P></

在Windows的DLL separated created the for custom控制在控制和…the the对话框给设计师。P></


我已经看见the same问题,我认为它是错误的。现在在和我(我不认为of the精确,即使在特殊)创造完全新的形态和空和控制单增的原因设计师Will the custom to describe the Way You中炸毁。pasting Copying & the Code for the New Empty品牌进入自定义控制项目和增it to the New form,不会出现问题。P></

设计师不只是茶茶行近顶端产生的InitializeComponent():theP></

1
 this.customControl1 = new Controls.CustomControl();

事实上,如果insert the above manually en is when the在线项目rebuilt is removed。P></

在我回来以前项目看,能看到the present错误是在VS2005和今天仍然在vs2010中得到它。我peppered with previous代码位是这样:P></

1
2
3
4
5
6
public MyForm()
{
    // HACK: work around VS bug
    this.customControl1 = new Controls.CustomControl();
    InitializeComponent();
}

needless说,the most of the time的设计师的作品。我consistently not found the Way of any reproducing除尘问题,but from the solution interestingly在形态和recreating one with the same name is the +自定义的控制,仍然有问题。P></


这也occurred error for one of forms和我们有我们的时间真的是很难的故障是常见的。其实我在the形态.cs 3X队列文件。基于form.cs茶,茶是designer.cs and the form(EN是扩展部分declared as a class)。P></

我知道myform.cs:P></

1
2
3
4
5
6
7
8
9
namespace MyNamespace
{
    public partial class MyForm : Form
    {
        // Some variable declarations

        // Some method declarations
    }
}

myform.designer.cs:P></

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace MyNamespace
{
    partial class MyForm
    {
        #region Auto Generated
        protected override void Dispose(bool disposing)
        {
            // Generated dispose code here
        }

        private void InitializeComponent()
        {
            // Generated designer code here

            // Error 'The variable <variable name> is either undeclared or was never assigned' points to one of the lines in here.
        }

        #endregion
    }
}

myform.extended.cs:P></

1
2
3
4
5
6
7
8
9
namespace MyNamespace
{
    public partial class MyForm
    {
        // Some variable declarations

        // Some method declarations
    }
}

我的问题是这房子是for the the variable变量declarations for the设计师必备的occur InitializeComponent调用的后面在茶叶中的任何文件。designer.cs and not of the other源文件中。我知道当它毋宁是说the variable undeclared恩!在外面undeclared was looking for the the扫帚/设计师。P></

似乎有人决定declarations to move into one of the other变量和类文件的部分不realise that the设计师打破。P></


As You should not have说坏的,有任何复杂逻辑控制of the user in the构造函数。P></

我们在任何地方,给复杂的initialisations should be the Load事件处理程序(或切换)。不管一个人多,在VS2010,using the of the Load事件控制(or is not onLoad(足够的)。P></

如果你在residing UserControl is the same as the form is that装配使用它,你想在View the form does not only the VS2010设计器execute the,but also of the UserControl的构造函数,其带载或空载(事件)。this does not to似乎总是发生,but when the needs to the设计师形态重建。P></

我知道如果你有任何外部资源或使用复杂的逻辑在那里,像数据库,它可以把this error when the opening for the enclosing设计师形态。This is using the Load事件因为坏should be the right to do恩广场。P></

You might have to for any重要资源利用initialisation懒惰初始化之前你have to running the form。P></

例如:P></

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MyUserControl: UserControl
{
    ...

    private List<MyObject> myObjects = null;
    private List<MyObject> MyObjects
    {
        get
        {
            if (myObjects == null)
            {
                // lazy initialisation here
                using (var dbContext = new MyVerySpecialDatabaseContext())
                {
                    myObjects = dbContext.MyObjects.ToList();
                }
            }
            return myObjects;
        }
    }

    public MyUserControl()
    {
        InitializeComponent();

        this.Load += new System.EventHandler(this.MyUserControl_Load);

        ... // more UI initialization, but no complicated logic here
    }

    private void MyUserControl_Load(object sender, EventArgs e)
    {
        this.myDataBindingSource.DataSource = MyObjects;
    }
}

在我的例子中,取决于我为其构建项目的平台。对于x86,一切都是正确的,但是对于x64,我收到了这个错误。所以,我的解决方案是在debug/x86下开发这个项目,然后为所有需要的目标平台构建它。


这是IDE中的一个bug。无论您如何看待它,构造函数都有一种不确定的方法来实例化您的字段,并在稍后的构造函数中将它们用作静态字段。

例如:

1
2
3
4
5
6
private ComponentResourceManger resources = null;

private void InitializeComponent() {
  resources = new ComponentResourceManager(typeof(MainForm));
  ...
}

通常会破坏你的设计师。有时它会起作用,但通常它会混淆……可以重命名所有嵌入的资源,甚至删除它们。在.resx文件中有一个图像副本是有意义的,但是设计者希望每个控件都有一个副本。即使是共享的……它喜欢复制。

典型错误包括,"找不到‘mainform’",然后向下。为resources.getobject("myimage")获取一些NPE,即使.resx指定了确切的文件名。

如果在initializecomponent()例程中声明obj,则通常可以保证解决方法正常工作。

1
2
3
4
private void InitializeComponent() {
  ComponentResourceManager resources = new ComponentResourceManager(typeof(MainForm));
  ...
}

如何从外部引用这一点取决于您自己。


检查你的designer.cs文件。它控制declarations may be missing。P></

does你建立和运行代码?P></