2012-07-18 21 views
8

Me gustaría obtener algunos consejos sobre cómo separar la interfaz de usuario y la lógica empresarial en una simple aplicación C# Windows Forms Application.C# Aplicación Windows Forms: GUI separada de Business Logic

Tomemos este ejemplo:

La interfaz de usuario se compone de un cuadro de texto simple y un botón. El usuario ingresa un número entre 0 y 9 y hace clic en el botón. El programa debe agregar 10 al número y actualizar el cuadro de texto con ese valor. parte lógica

enter image description here

La empresa debe tener ni idea de la interfaz de usuario. ¿Cómo se puede lograr esto?

Aquí está la clase Process vacía (lógica de negocios):

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

El requisito es:

  1. Cuando el usuario hace clic en el botón, de alguna manera, el Proceso :: AddTen se invoca.
  2. El cuadro de texto debe actualizarse con el valor de retorno de Process :: AddTen.

Simplemente no sé cómo conectar estos dos.

Respuesta

6

Primero, debe cambiar el nombre de su clase. "Proceso" es el nombre de una clase en la Biblioteca de clases y probablemente cause confusión a cualquiera que lea su código.

Supongamos, para el resto de esta respuesta que ha cambiado el nombre de la clase a MyProcessor (siendo un mal nombre, pero no una, clase de uso frecuente conocida.)

También, usted' Falta el código para verificar que la entrada del usuario sea, de hecho, un número entre 0 y 9. Eso es apropiado en el código del formulario en lugar del código de clase.

  • Suponiendo que el cuadro de texto se llama textBox1 (El VS genera por defecto para el primer cuadro de texto agrega al formulario)
  • suponiendo además el nombre del botón es el botón 1

En Visual Studio, haga doble clic en el botón para crear el controlador de eventos de clic de botón, que se verá así:

protected void button1_Click(object sender, EventArgs e) 
{ 

} 

Dentro del controlador de eventos, agregue código para que se vea así:

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(); 
} 

La clase, con el modificador de acceso configurado correctamente, debería tener este aspecto:

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

No ensuciar demasiado las aguas, pero también podría cambiar la función AddTen para aceptar una entrada de cadena y realizar la validación dentro de esa función. Esa sería en realidad mi preferencia, y sacaría más de la lógica de negocios de la forma, pero de cualquier manera funcionaría. – David

+0

Perdón por todas las ediciones. Debería haberlo hecho en Visual Studio. Capturaría todos los errores de compilación y lógica de inmediato. – David

2

Haga su clase 'Proceso' pública (y como dice @DavidStratton, cambiar el nombre) :

public class MyProcess 

yo diría que debe analizar el valor de stringTextBox.Text a un int:

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; 
} 
+0

Olvidé hacer pública la clase Process en mi respuesta. +1 por una buena captura. – David

1

Puede crear otra clase llamada "Process.cs", por ejemplo. Métodos que implican el procesamiento o el cálculo de datos que se mueve allí. En su caso, por ejemplo:

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

Su evento click interfaz de usuario tendrá una llamada a su "capa de Proceso":

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

    textBox.Text = calculatedValue.ToString(); 

De esta manera su lógica de negocio, tales como el cálculo se mantiene separado. Si su UI cambia, puede simplemente llamar al método myProcess.AddTen() ya sea un formulario web, Windows o Móvil.

Cuestiones relacionadas