论坛; 我是一个新手,编写了一些代码.我想知道使用包含其他类和函数的单独.cs文件的最佳方法.作为基本功能的一个示例,您可以单击清除按钮并清除表单上的所有字段.代码分为三个.cs文件.Main.cs,MainForm.Designer.cs和btClear.cs.
MainForm.Designer.cs包含设计者自动创建的代码,包括Clear Button和我想要清除的文本框.
我想让代码清除btClear.cs中包含的文本框.我理解简单地将此代码放在MainForm.Designer.cs中会很容易,但我想将其用作模板,以便使用单独的.cs文件作为标准做法.
有人能给我一个如何做到这一点的例子吗?
大多数.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
是机器生成的,你永远不应该把自己的代码放在那里.
您可以使用partial
类的MainForm
类,因为这是已经在做MainForm.cs
和MainForm.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(); } }