当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C#中使用单独的.cs文件?》经验,为你挑选了2个好方法。

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

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

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

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



1> Sergio Acost..:

大多数.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是机器生成的,你永远不应该把自己的代码放在那里.



2> Samuel..:

您可以使用partial类的MainForm类,因为这是已经在做MainForm.csMainForm.Designer.cs.

btnClear.cs

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

并在MainForm.cs或注册参加活动MainForm.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();
  }
}

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有