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