[WPF][C#] Programar los eventos en una clase Controladora.

Iniciado por Mitsu, 22 Octubre 2013, 19:49 PM

0 Miembros y 1 Visitante están viendo este tema.

Mitsu

Buen día.

Este es mi primer programita en C#, y la verdad no entiendo muchas cosas. Espero me puedan echar un cable  :xD Por cierto, uso Visual Studio Express 2013, que está muy bonita xD

El programita es sencillo, solo registrará los datos de un trabajador en una tabla. Tengo las siguientes clases:

  • Clase Trabajador (pojo). Este será el prototipo del trabajador, todos se crearán a partir de esta pojo.
  • Clase MainWindow (Formulario)
  • Clase Controller (Controlador del programa)
  • Clase RegistrarTrabajador (Modelo del programa)
  • Clase Conexion (Complemento del Modelo).

    La idea es sencilla, estoy utilizando el patrón MVC, para conectar el Controlador con la vista y con el modelo. Ahora, el problema que tengo es el siguiente:

    En Java, basta con pasarse la referencia  del Controlador, al componente que efectuará el evento. bastaría con hacer:

    Código (=java) [Seleccionar]

    public void setControlador(Controller controlador)
    {
       btnRegistrar.addActionListener(controlador);
       btnNuevo.addActionListener(controlador);
       btnSalir.addActionListener(controlador);
     }

    Luego, en la clase Controller:

    Código (=java) [Seleccionar]


    public class Controller implements ActionListener {

    private Formulario vista;
    private Modelo modelo;

     public Controller (Formulario vista, Modelo modelo)
      {
         this.vista = vista;
         this.modelo = modelo;
      }

    @Override
     actionPerformed(ActionEvent e)
      {
         // eventos
      }

    }



    ¿Cómo puedo lograr lo mismo en C#?


    Clases Trabajador (Pojo), Controller (Controlador), RegistrarTrabajador (Modelo), Formulario :

    Código (=csharp) [Seleccionar]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace RegistroDeUsuarios.pojo
    {
       public class Trabajador
       {
           private string primerNombre;
           private string segundoNombre;
           private string primerApellido;
           private string segundoApellido;
           private string rangoTrabajador;
           private string fechaNacimiento;

           // setters

           public void setPrimerNombre(string primerNombre)
           {
               this.primerNombre = primerNombre;
           }
           public void setSegundoNombre(string segundoNombre)
           {
               this.segundoNombre = segundoNombre;
           }
           public void setPrimerApellido(string primerApellido)
           {
               this.primerApellido = primerApellido;
           }
           public void setSegundoApellido(string segundoApellido)
           {
               this.segundoApellido = segundoApellido;
           }
           public void setRangoTrabajador(string rangoTrabajador)
           {
               this.rangoTrabajador = rangoTrabajador;
           }
           public void setFechaNacimiento(string fechaNacimiento)
           {
               this.fechaNacimiento = fechaNacimiento;
           }

           // getters

           public string getPrimerNombre()
           {
               return this.primerNombre;
           }
           public string getSegundoNombre()
           {
               return this.segundoNombre;
           }
           public string getPrimerApellido()
           {
               return this.primerApellido;
           }
           public string getSegundoApellido()
           {
               return this.segundoApellido;
           }
           public string getRangoTrabajador()
           {
               return this.rangoTrabajador;
           }
           public string getFechaNacimiento()
           {
               return this.fechaNacimiento;
           }

       }
    }


    Clase Controller
    Código (=csharp) [Seleccionar]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using RegistroDeUsuarios.pojo;


    namespace RegistroDeUsuarios
    {
       
      public class Controller
       {
           private MainWindow vista;
           private RegistrarTrabajador modelo;
         

          public Controller()
           {

           }
           public Controller(MainWindow vista, RegistrarTrabajador modelo)
           {
               this.vista = vista;
               this.modelo = modelo;
               
           }
           

          public void btnRegistrar_Click(Object sender, RoutedEventArgs e)
          {
              Trabajador trabajador = new Trabajador();
              trabajador.setPrimerNombre(vista.txtPrimerNombre.Text);
              trabajador.setSegundoNombre(vista.txtSegundoNombre.Text);
              trabajador.setPrimerApellido(vista.txtPrimerApellido.Text);
              trabajador.setSegundoApellido(vista.txtSegundoApellido.Text);
              trabajador.setRangoTrabajador(vista.cboRangoTrabajador.SelectedItem.ToString());
              trabajador.setFechaNacimiento(vista.txtFechaNacimiento.Text);
              modelo.registrarTrabajador(trabajador);
          }
          public void btnNuevo_Click(Object sender, RoutedEventArgs e)
          {
              vista.clean();
          }
          public void btnSalir_Click(Object sender, RoutedEventArgs e)
          {
              //Application.Current.Shutdown();
          }
       }
    }



    Clase RegistrarTrabajador:
    Código (=csharp) [Seleccionar]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MySql.Data.MySqlClient;
    using RegistroDeUsuarios.pojo;

    namespace RegistroDeUsuarios
    {
       public class RegistrarTrabajador
       {
           public static MySqlConnection conexion = new MySqlConnection();
           public static MySqlCommand comando = new MySqlCommand();
           public static string CadenaDeConexion;

           public void registrarTrabajador(Trabajador trabajador)
           {
               // Aquí se llevara a cabo la conexion
               CadenaDeConexion = "Server=localhost;"
                                   + "Port=3307;"
                                   + "Database=mysql_ifxperu;"
                                   + "Uid=root;"
                                   + "Password=";

               try
               {
                   conexion.ConnectionString = CadenaDeConexion;
               }
               catch (Exception ex)
               {
                   Console.WriteLine(ex.Message);
               }

               try
               {
                   // Abrimos la conexión
                   conexion.Open();
                   // Definimos nuestro Query
                   string query = "insert into empleados VALUES('"+trabajador.getPrimerNombre()+"','"+trabajador.getSegundoNombre()+"','"+trabajador.getSegundoApellido()+"','"+
                       trabajador.getSegundoApellido()+"','"+trabajador.getRangoTrabajador()+"','"+trabajador.getFechaNacimiento()+"')";
                   // Establecemos cuál será la conexión
                   comando.Connection = conexion;
                   // Determinamos el comando [ nuestro query]
                   comando.CommandText = query; //Se le asigna la consulta
                   // Asignamos al objeto MySqlReader la ejecución del comando
                   // En otras palabras, el resultado de la consulta [query]
                   // Se guardará en el MySqlReader
                   comando.ExecuteNonQuery();
                   MessageBox.Show("Alta del empleado satisfactoria.");
               }
               catch (Exception ex)
               {
                   Console.WriteLine(ex.Message);
               }
               finally {
                   conexion.Close();
               }
           }
       }
    }



    Clase Formulario
    Código (=csharp) [Seleccionar]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    namespace RegistroDeUsuarios
    {
       
       public partial class MainWindow : Window
       {
           public MainWindow()
           {
               InitializeComponent();
               cboRangoTrabajador.Items.Add("Administrador");
               cboRangoTrabajador.Items.Add("Vendedor");
               cboRangoTrabajador.Items.Add("Contador");
               cboRangoTrabajador.Items.Add("Tecnico Mantenimiento");
               cboRangoTrabajador.Items.Add("Programador");
               cboRangoTrabajador.Items.Add("Analista");
               cboRangoTrabajador.SelectedIndex = 0;
           }

           public void setControlador(Controller controlador)
           {
               controlador.btnRegistrar_Click(controlador,new RoutedEventArgs());
               controlador.btnNuevo_Click(controlador,new RoutedEventArgs());
               controlador.btnSalir_Click(controlador,new RoutedEventArgs());
           }

           public void clean()
           {
               txtPrimerNombre.Clear();
               txtSegundoNombre.Clear();
               txtPrimerApellido.Clear();
               txtSegundoApellido.Clear();
               txtFechaNacimiento.Clear();
               cboRangoTrabajador.SelectedItem = "Administrador";
               txtPrimerNombre.Focus();
           }
         

       }
    }



    *** UPDATE ***

    He creado una clase principal, que sustituye al Main que genera WPF.

    Código (=csharp) [Seleccionar]

    using System.Windows.Media.Imaging;
    using System.Windows.Media.Media3D;
    using System.Windows.Media.TextFormatting;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Shell;

    namespace RegistroDeUsuarios
    {
       class Principal
       {
           // <summary>
           /// Application Entry Point.
           /// </summary>
           [System.STAThreadAttribute()]
           [System.Diagnostics.DebuggerNonUserCodeAttribute()]
           public static void Main()
           {
               
               MainWindow vista = new MainWindow();
               RegistrarTrabajador modelo = new RegistrarTrabajador();
               Controller control = new Controller(vista, modelo);
               vista.setControlador(control);
               MessageBox.Show("Hola");
               RegistroDeUsuarios.App app = new RegistroDeUsuarios.App();
               app.InitializeComponent();
               app.Run();
           }

       }
    }



    Otra duda, quiero colocar un método en el Formulario, para arrancar la aplicación a demanda. Esto porque en el Main crearé los objetos MainWindow y RegistrarTrabajador, para pasárselos al Controller, para que se asocie a las 2 clases, y el objeto Controller pasárselo por medio de setControlador(Controller controlador) al Formulario. ¿Cómo haría?



    Muchas gracias!

Mitsu

Me autorespondo. En C# no existe el patrón MVC, se usa MVVM y DataBinding. C# me parece un lenguaje muy moderno y completo, voy a seguir estudándolo.


Saludos weys.