C#未能找到方法

如上图,因为将所有控件都放在窗体中,由窗体维护,窗体文件中的代码就会很多,维护很不方便,所以我将控件分类,放在不同的文件里(普通类,不是自定义面板类等),然后单独维护,这样,虽然运行的时候问题不大,但是在设计时,窗体设计界面无法正常显示。

为什么不用自定义面板?因为自定义面板维护在空间上有限制,而我想在逻辑上分别进行维护,比如,所有的按钮由一个类单独维护,所有的标签由一个单独的类维护等。但是,可能不容易甚至不能实现。

pipes = new CommunicationsLibrary.ComWithUser.WithWaterPipes();
pipes.InitializeComponent(this);              //自定义的WithWaterPipes类中的方法。

开始我觉得是因为单独维护控件的类是用new新建的,所以是在运行时才生成实例的,在设计时没有pipes实例,pipes=null,所以设计时找不到InitializeComponent()方法。但是我发现那些在代码在窗体文件中的控件,也是用new实例化的啊(但是,InitializeComponet()方法是在窗体的构造方法中调用的。)

而且我在主窗体中将InitializeComponent()方法中的部分控件的实例化移出到相同类的一个单独的方法中,然后再InitializeComponent()方法中调用此方法还会出现找不到方法的问题。

可能是C#和C/C++相似,方法需要先声明后调用?

但是C#中不存在头文件之类的东西啊。即使把方法的定义放到InitializeComponent()方法之前也是不行。

此错误的实例(1)
 
1.  
在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
在 Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 

不过我发现,可能还是new的问题,因为将新方法的调用放到窗体的构造方法中,在InitializeComponent()之后,就可以显示设计界面,但是没有控件。

或者放到xxxForm_Load()方法中,效果同上。

这时候设计界面不会报错,能显示窗体,以及在窗体的InitializeComponent中初始化的控件,但是不能显示自组织的控件,运行时都可以正常显示。

public TestForm(){

    InitializeComponent();

    method1();

    method2();

    method3();

}

这没问题。但是

public TestForm(){

    InitializeComponent();

}

private void InitializeComponent(){

    method1();

}

private void method1(){ 

    ;

}

就会找不到方法method1()。

既然现在没有报错,说明在设计界面时VS就能找到自定义的方法,但是界面上并没有显示自定义类的初始化方法中初始化的控件,说明VS在设计时虽然能找到自定义方法,但是并没有调用,直到运行时才调用。

看来最初的愿望是不能实现了,虽然代码都分门别类放到不同文件中,不会出现一个类里代码特别多的现象,但是因为设计时看不到效果,所以这个方法,基本上就是不可取的了。

而且就算上述问题解决了,还会有其他问题,比如有的时候不得不在维护按钮的类里引入其他类型的控件等。

不过可以在窗体类中通过多定义方法的方式组织代码,虽然不能减少代码量,但是至少组织的更有条理了。开发维护都会容易些。

相关文章: