Winform:为什么我不能将instanciation移出InitializeComponent?

时间:2010-12-03 15:59:30

标签: c# winforms

Visual Studio创建了此代码:

    private void InitializeComponent()
    {

        this.trackBar1 = new System.Windows.Forms.TrackBar();

我只想这样做:

    private void instantiate()
    {

        this.trackBar1 = new System.Windows.Forms.TrackBar();
    }

    private void InitializeComponent()
    {

        instantiate();

程序编译并执行但Visual Studio无法再在winform上绘制控件。如何解决这个问题?

更新:我知道代码是自动生成的,但为什么在运行时执行而不是在设计时它不像普通的c#代码一样执行?

我真的怀疑像苹果这样的微软正在努力让编码人员把他们紧紧抓住他们的想法,你必须真的让Sherlock Holmes去查询:)

http://cocoawithlove.com/2009/02/interprocess-communication-snooping.html

4 个答案:

答案 0 :(得分:4)

InitializeComponent()是由设计者自动生成的方法。如果你修改它,设计师可能无法加载你的控件,可能会发生其他有趣的事情。

您想要达到什么目标?

答案 1 :(得分:2)

请注意设计师显示的错误消息:

  

找不到方法'System.Windows.Forms.Form.instantiate'。

抱怨 Form 类没有实例化方法而不是你的表格派生类确实有这个方法。这是不可避免的,该类型在反序列化之前尚不存在,它只能反映在基类成员上。

但是,不要这样做,一旦设计器重新序列化表单并重新生成InitializeComponent()方法,你的代码就会被踩踏。编辑该方法可确保损失。你想做的原因尚不清楚。您可以使用自定义构造函数创建基本表单并从中继承。

答案 2 :(得分:1)

Visual Studio仅显示* .designer.cs文件中的内容。如果你移动它之外的东西,它将不知道你想要显示什么控件。

如果在InitializeComponent之外创建控件,请不要忘记将其添加到Form的Control collection

this.Controls.Add(trackBar1);

答案 3 :(得分:1)

如果您想在不使用设计器的情况下向表单添加控件等,请使用instantiate()方法执行此操作,但请从控件的构造函数中调用instantiate(),而不是编辑{{ 1}}方法。

手动编辑由IDE创建和维护的方法永远不是一个好主意(为此,手动编辑来自代码生成器的任何代码将使您进入麻烦)。