2009-02-26 84 views
0

我是C#的新手(来自Delphi),发现我的main.cs文件变得相当大。在Delphi中,我可以在.pas文件中创建类并从我的主应用程序文件中使用它。我只是添加使用(文件名)关键字。巨大的main.cs文件

我的问题是我该如何在C#中做类似的事情?例如:

的Delphi:

Button1.Visible = False; 

我可以通过添加一个参考到主单元是指在另一单元的按钮属性:

frmMain.Button.Visible = True; 

在C#我想移动这个代码到另一个.cs文件并从我的主窗体调用它。这是行不通的。

private void manageMainMenuButtons() 
{ 
    if (rtbSharedSARP.Text == "") 
    { 
    utmToolBar.Tools["First"].SharedProps.Enabled = false; 
    utmToolBar.Tools["Previous"].SharedProps.Enabled = false; 
    utmToolBar.Tools["Next"].SharedProps.Enabled = false; 
    utmToolBar.Tools["Last"].SharedProps.Enabled = false; 
    } 
    else 
    { 
    utmToolBar.Tools["First"].SharedProps.Enabled = true; 
    utmToolBar.Tools["Previous"].SharedProps.Enabled = true; 
    utmToolBar.Tools["Next"].SharedProps.Enabled = true; 
    utmToolBar.Tools["Last"].SharedProps.Enabled = true; 
    } 
} 

不是最好的例子,但我希望有人能帮助我。

+0

您是否收到一条错误消息?它是否编译,但没有可见的效果?需要更多的信息。 – Larsenal 2009-02-26 19:31:03

回答

2

除非您的“主”表单上有数百个控件,否则听起来好像您并未分离业务逻辑和表示逻辑。您应该设置单独的类(分开的文件)来处理您的业务逻辑,并且每个表单都应该有自己的设计器和代码。

1

C#是面向对象的,因此您需要对其他类中的实例化窗口进行引用。如果在每个方法中添加Form mainForm作为参数,并且从表单类传递它this,那么在外部方法中,您可以说mainForm.property

这就是说,你的问题使我认为你会从一些阅读面向对象设计,以及使用c#和winforms的应用程序体系结构中受益。

+0

要添加到最后一句中,将对主窗体的引用传递给这样的方法并不是一个好主意。如果其他类需要对表单进行一些访问,则可以在子控件中创建可由主表单处理的事件。 – 2009-02-26 19:43:52

4

首先,你需要确保你在同一个命名空间是:

namespace mynamesspace { 

接下来,如果你的类成员私下宣称,你需要指出你在那类工作:

public partial class frmMyForm : Form { 

请注意,这是扩展原来的类。如果你访问的是公共成员(这是一个很好的方式去处理事情),你可能只需要指定命名空间。

+0

虽然这绝对是他的问题的答案... ick。我真的不喜欢分班。我猜想生成的代码是可以的,但是否则他们已经得到了代码味道。 – 2009-02-26 20:27:51

2

假设您正在使用最佳实践并正确地分离逻辑(如果您不是这样做的话,这将是一个很好的起点),C#使用所谓的部分类来允许将一个类分解为多个文件。 例如:

Main1.cs:

namespace Program 
{ 
    public partial class Main 
    { 
     private Form frmMain; 
    } 
} 

Main2.cs:

namespace Program 
{ 
    public partial class Main 
    { 
     void MainMethod() 
     { 
      frmMain.Button.Visible = true; 
     } 
    } 
} 

MainMethod可以访问frmMain因为据编译器来讲,他们是在同一个类定义尽管在不同的文件。

0

在这种特殊情况下,utmToolBar几乎可以肯定地控制你的表单和变量名称在表单类的范围内。你可能迁移到另一个文件,但这可能不是正确的方式来打破你的文件。您可以通过在项目资源管理器中右键单击您的项目并选择添加类来完成。如果您希望向C#项目添加类,则可以这样做。然后,您可以使用简单的剪切粘贴将功能移入该类,并由类引用代替。

这几乎没有触及冰山一角,我建议你拿起任何基本的C#书籍,并开始阅读。这将比任何适合这个论坛的答案都更有意义。

0

您可以使manageMainMenuButtons成为任何其他文件的静态方法并传递引用,或者将其用作实用工具,甚至可以使用表单的部分定义创建其他文件。下面是一个例子,作为一个重构一点点的静态方法。我不确定utmToolBar是什么,所以我尝试了我的想法。

XXX.manageMainMenuButtons(utmToolBar, string.IsNullOrEmpty(rtbSharedSARP.Text)); 

public static void manageMainMenuButtons(Object /*whatever utmToolBar actually is*/ utmToolBar, bool disable) 
{ 
    utmToolBar.Tools["First"].SharedProps.Enabled = disable; 
    utmToolBar.Tools["Previous"].SharedProps.Enabled = disable; 
    utmToolBar.Tools["Next"].SharedProps.Enabled = disable; 
    utmToolBar.Tools["Last"].SharedProps.Enabled = disable; 
} 
0

如果你想访问控制,如窗体上的一个按钮,从一个代码在一个单独的文件,你只需要确保该文件中的代码包含在同一个命名空间为您的形成。

例如,在你的窗体设计文件:

namespace MyWindowsApp{ 
    class MyForm{ 
     //various control declarations 
    } 
} 

然后,在外部文件:

namespace MyWindowsApp{ 
    class MyClass{ 
     //Miscellaneous code 
    } 
} 

MyClass的将有知识,并获得MyForm的和所有的公共属性。

希望这是一些帮助, 李