10

我想要一些关于如何在一个简单的 C# Windows 窗体应用程序中分离 UI 和业务逻辑的建议。

让我们看这个例子:

UI 由一个简单的文本框和一个按钮组成。用户输入一个介于 0 和 9 之间的数字并单击按钮。程序应将 10 添加到数字并使用该值更新文本框。

在此处输入图像描述

业务逻辑部分应该不知道 UI。如何实现?

这是空的 Process 类(业务逻辑):

namespace addTen
{
    class Process
    {
        public int AddTen(int num)
        {
            return num + 10;
        }
    }
}

要求是:

  1. 当用户单击按钮时,会以某种方式调用 Process::AddTen。
  2. 必须使用 Process::AddTen 的返回值更新文本框。

我只是不知道如何连接这两个。

4

4 回答 4

8

首先,您需要更改您的班级名称。“ Process ”是类库中的一个类的名称,可能会使任何阅读您的代码的人感到困惑。

让我们假设,对于这个答案的其余部分,您将类名更改为MyProcessor(仍然是一个坏名字,但不是一个众所周知的、经常使用的类。)

此外,您还缺少要检查的代码,以确保用户输入确实是 0 到 9 之间的数字。这适用于 Form 的代码而不是类代码。

  • 假设 TextBox 被命名为 textBox1 (VS 为添加到表单的第一个 TextBox 生成默认值)
  • 进一步假设按钮的名称是 button1

在 Visual Studio 中,双击按钮以创建按钮单击事件处理程序,如下所示:

protected void button1_Click(object sender, EventArgs e)
{

}

在事件处理程序中,添加代码使其如下所示:

 protected void button1_Click(object sender, EventArgs e)
 {
   int safelyConvertedValue = -1;
   if(!System.Int32.TryParse(textBox1.Text, out safelyConvertedValue))
   {
     // The input is not a valid Integer value at all.
     MessageBox.Show("You need to enter a number between 1 an 9");
     // Abort processing.
     return;
   }

   // If you made it this far, the TryParse function should have set the value of the 
   // the variable named safelyConvertedValue to the value entered in the TextBox.
   // However, it may still be out of the allowable range of 0-9)
   if(safelyConvertedValue < 0 || safelyConvertedValue > 9)
   {
     // The input is not within the specified range.
     MessageBox.Show("You need to enter a number between 1 an 9");
     // Abort processing.
     return;
   }

   MyProcessor p = new MyProcessor();
   textBox1.Text = p.AddTen(safelyConvertedValue).ToString();
 }

正确设置访问修饰符的类应如下所示:

namespace addTen       
{       
    public class MyProcessor
    {       
        public int AddTen(int num)       
        {       
            return num + 10;       
        }       
    }       
}    
于 2012-07-18T17:58:28.323 回答
3

例如,您可以创建另一个名为“Process.cs”的类。涉及您移动到那里的处理或数据计算的方法。以您为例:

public class Process
{
 public int AddTen(int num)
 {
   return num + 10;
 }
}

您的 UI 点击事件将调用您的“流程层”:

 var myProcess = new Process();
  //and then calculation
  var initNumber = Convert.ToInt32(textBox.Text);
  var calculatedValue = myProcess.AddTen(initNumber);

  textBox.Text = calculatedValue.ToString();

这样,您的业务逻辑(例如计算)将单独保存。如果您的 UI 发生变化,您仍然可以简单地调用 myProcess.AddTen() 方法,无论它是 Web、Windows 还是移动表单。

于 2012-07-18T18:03:42.957 回答
2

公开您的“流程”课程(正如@DavidStratton 所说,更改名称):

public class MyProcess

我会说你应该将你的string价值解析TextBox.Textint

private void button1_Click(object sender, EventArgs e)
{
    MyProcess myProcess = new MyProcess();
    string result = textBox1.Text;
    int number;

    if(int.TryParse(textBox1.Text, out number))
    {
        result = myProcess.AddTen(number).ToString();
    }

    textBox1.Text = result;
}
于 2012-07-18T18:02:53.020 回答
0

要完全分离逻辑,您可以声明一个可以包含按钮和管理处理程序的基类。你的具体流程可以继承基类,逻辑可以设置。最后,表单可以声明类的实例并传入按钮。

它看起来像这样:

class BaseProcessor
{

    System.Windows.Forms.Button myButton;
    public System.Windows.Forms.Button MyButton
    {
        get
        {
            return myButton;
        }
        set
        {
            myButton = value;
            myButton.Click += new System.EventHandler(this.MyButton_Click);
       }
    }

    public BaseProcessor()
    {
    }

    public virtual void MyButton_Click(object sender, EventArgs e)
    {
    }

然后声明流程:

class MyProcess : BaseProcessor
{

    public override void MyButton_Click(object sender, EventArgs e)
    {
        MessageBox.Show("This is my process");
    }
}

然后在表单中,声明一个流程实例并附加按钮:

public partial class Form1 : Form
{

    MyProcess myProcess = null;

    public Form1()
    {
        InitializeComponent();

        myProcess = new MyProcess
        {
            MyButton = button1
        };
    }

}

使用这种方法,表单中没有业务逻辑代码。父类很有用,因为像单击按钮这样的事件非常常见,因此在我看来更容易集中声明它们。

于 2019-01-09T16:07:10.573 回答