如何在C#中使用单独的.cs文件?

时间:2009-02-21 05:17:18

标签: c#

论坛;我是一个新手,编写了一些代码。我想知道使用包含其他类和函数的单独.cs文件的最佳方法。作为基本功能的一个示例,您可以单击清除按钮并清除表单上的所有字段。代码分为三个.cs文件。 Main.cs,MainForm.Designer.cs和btClear.cs。

MainForm.Designer.cs包含设计者自动创建的代码,包括Clear Button和我想要清除的文本框。

我想让代码清除btClear.cs中包含的文本框。我理解简单地将此代码放在MainForm.Designer.cs中会很容易,但我想将其用作模板,以便使用单独的.cs文件作为标准做法。

有人能给我一个如何做到这一点的例子吗?

7 个答案:

答案 0 :(得分:6)

大多数.net程序员都会这样做:

  • 将所有代码保留在MainForm.cs中,但声明一种新方法来分隔执行清算的代码。

我总是留在事件处理程序方法(双击按钮时生成的VS)代码来更改鼠标光标(如果我调用的代码需要几秒钟或更长时间才能运行)和捕获所有未处理的异常,并将我的逻辑放在一个单独的私有方法中:

partial class MainForm : Form // this is MainForm.cs
{
    // This is the method VS generates when you double-click the button
    private void clearButton_Click(object sender, EventArgs e)
    {
        this.Cursor = Cursors.WaitCursor;
        try
        {
            ClearForm();
        }
        catch(Exception ex)
        {
            // ... have here code to log the exception to a file 
            // and/or showing a message box to the user
        }
        finally
        {
            this.Cursor = Cursors.Default;
        }
    }

    private void ClearForm()
    {
        // clear all your controls here
        myTextBox.Clear();
        myComboBox.SelectedIndex = 0;
        // etc...
    }
}

在我看来,如果你想按照传统的.net方式做事,你应该坚持第一个例子。

当代码不是表单逻辑的一部分时,建议将<。>文件移出表单.cs文件,例如,数据访问代码或业务逻辑。在这种情况下,我认为清除表单控件不符合业务逻辑。它只是表单代码的一部分,应该保留在MainForm.cs

但是如果你真的想将ClearForm方法放在另一个.cs文件中,你可以创建一个新类并在那里移动ClearForm方法。您还需要将每个控件的Modifiers属性更改为Public,以便新类可以从MainForm外部访问它们。像这样:

public class FormCleaner // this is FormCleaner.cs
{
    public void ClearForm(MainForm form)
    {
        // clear all your controls here
        form.myTextBox.Clear();
        form.myComboBox.SelectedIndex = 0;
        // etc...
    }
}

您必须将主表单代码更改为:

partial class MainForm : Form // this is MainForm.cs
{
    // This is the method VS generates when you double-click the button
    private void clearButton_Click(object sender, EventArgs e)
    {
        this.Cursor = Cursors.WaitCursor;
        try
        {
            FormCleaner cleaner = new FormCleaner();
            cleaner.ClearForm(this);
        }
        catch(Exception ex)
        {
            // ... have here code to log the exception to a file 
            // and/or showing a message box to the user
        }
        finally
        {
            this.Cursor = Cursors.Default;
        }
    }
}

但请注意,您的FormCleaner课程必须知道您的MainForm课程才能知道如何清除表单的每个控件,或者您需要提出一个通用的能够循环遍历任何表单的Controls集合以清除它们的算法:

public class FormCleaner // this is FormCleaner.cs
{
    // 'generic' form cleaner
    public void ClearForm(Form form)
    {
        foreach(Control control on form.Controls)
        {
            // this will probably not work ok, because also
            // static controls like Labels will have their text removed.
            control.Text = "";
        }
    }
}

正如其他人所说,MainForm.Designer.cs是机器生成的,你永远不应该把自己的代码放在那里。

答案 1 :(得分:5)

您可以为MainForm课程使用partial课程,因为这已经在MainForm.csMainForm.Designer.cs中完成。

btnClear.cs

public partial class MainForm
{
   private void clearForm(object sender, EventArgs e)
   {
     // ...
   }
}

MainForm.csMainForm.Designer.cs

中注册活动
this.btnClear.click += clearForm;

编辑:

如果您想要一种通用的方法,可以将控件的Tag属性设置为默认值。使用扩展方法,您可以执行formGroup.Reset();

之类的操作
using System.Windows.Forms;

public class ControlExtensions
{
  public void Reset(this Control control)
  {
    if (control.Tag != null)
    {
      if (control is TextBoxBase && control.Tag is string)
      {
        control.Text = control.Tag as string;
      }
      else if (control is CheckBox && control.Tag is bool)
      {
        control.Checked = control.Tag as bool;
      }
      // etc
    }

    foreach (Control child in control.Children)
      child.Reset();
  }
}

答案 2 :(得分:4)

每个.cs文件一个类是一个很好的规则。

除非您打算封装到可重用的类中,否则我不会将页面特定的功能分成单独的.cs文件。

修改

将clear函数放在按钮的OnClick事件中。没理由把它分开。

.aspx文件:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SimpleWebTest._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="ClearButton" runat=server onclick="ClearButton_Click" Text="Button" />
    </div>
    </form>
</body>
</html>

.cs文件

using System;

namespace SimpleWebTest
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e) { }

        protected void ClearButton_Click(object sender, EventArgs e)
        {
            using (ComplexOperationThingy cot = new ComplexOperationThingy())
            {
                cot.DoSomethingComplex();
            }
        }
    }
}

<强> ComplexOperationThingy.cs:

using System;

namespace SimpleWebTest
{
    public class ComplexOperationThingy
    {
        ComplexOperationThingy() { }

        public void DoSomethingComplex()
        {
            //Do your complex operation.
        }
    }
}

答案 3 :(得分:1)

这很简单。在btClear.cs文件中,只需生成类定义,如:

public class MyUtility
{
    public static void ClearContents(IEnumerable<Control> controls)
    {
        //TODO: Code that clears contents of controls passed
    }
}

然后,您可以通过以下方式从包含生成的类的命名空间的任何位置调用它:

MyUtility.ClearContents(SomeControlCollection);

我希望我没有完全错过你的意图。

答案 4 :(得分:1)

通常,您不应将代码放在MainForm.designer.cs文件中。 Visual Studio使用* .designer.cs文件连接表单上实际放置控件的所有繁琐管道。

您要用于与窗体上的控件交互的任何代码都应该是MainForm.cs文件。因此,如果您希望函数清除表单上的控件,那么您应该将代码放在那里。

如果您正在编写的代码清除表单上的控件可以在其他项目中重用,那么您应该将它放在另一个可以链接到其他项目的.cs文件中。

正如Chris所说,通常每个.cs文件放一个类也是个好主意。执行此操作时,该文件应具有其包含的类的名称。因此,如果您有一个名为MyButtonHelpers的类,则源文件应命名为MyButtonHelpers.cs。

答案 5 :(得分:0)

我发现最好不要直接编辑.Designer.cs文件,特别是从源代码管理的角度来看。您可以使用部分类来包含相关代码;在这种情况下,您可以使用MainForm.Designer.cs作为如何完成部分类的示例(例如,部分类MainForm {})。

如果要通过Windows窗体设计器添加事件处理程序,它应自动将它们放在MainForm.cs中,而不是MainForm.Designer.cs中。如果项目增长到任何显着大小,我经常会发现创建多个部分类文件很有用,每个主要功能组都有一个。这使得查找特定函数(和相关函数)变得更加容易。

答案 6 :(得分:0)

C#(和许多其他语言)中的约定是每个类一个文件(通常每个文件一个类)。这个规则当然有例外,但是在多个文件中拆分单个类应该是罕见的,而不是标准做法。

您在评论中提到,您可以预见到比您提供的示例更“复杂的操作”。你想要什么样的行动?只要您刚才谈论处理表单控件,逻辑就属于表单的.cs文件(在本例中为MainForm.cs,而不是 MainForm.designer.cs - as其他人说过,你不应该修改.designer文件。)

如果您的表单过于复杂,那么将其分解为单独的custom controls可能是有意义的。这将允许您保持较小的源文件,但(因为每个控件映射到一个类),您将坚持一个类&lt; - &gt;一个文件约定。