Pregunta

es lo primero en primer lugar. Tengo las siguientes clases:

class Employee
{
    private int employeeID;
    private string firstName;
    private string lastName;
    private bool eligibleOT;
    private int positionID;
    private string positionName;
    private ArrayList arrPhone;
    public IList<Sector> ArrSector {get; private set;}

    //the constructor method takes in all the information of the employee
    public Employee(int empID, string fname, string lname, bool elOT, int pos, string posname)
    {
        employeeID = empID;
        firstName = fname;
        lastName = lname;
        eligibleOT = elOT;
        positionID = pos;
        positionName = posname;
        arrPhone = new ArrayList();
        ArrSector = new List<Sector>();
    }

    //the constructor method takes in the employee id, the first name and the last name of the employee
    public Employee(int empid, string firstname,string lastname)
    {
        employeeID = empid;
        firstName = firstname;
        lastName = lastname;
    }

    //overtides the first name and the last name as a string.
    public override string ToString()
    {
        return firstName +" "+lastName;
    }



    public int EmployeeID
    {
        get { return employeeID; }
        set { employeeID = value; }
    }

    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public bool EligibleOT
    {
        get { return eligibleOT; }
        set { eligibleOT = value; }
    }

    public int PositionID
    {
        get { return positionID; }
        set { positionID = value; }
    }

    public string PositionName
    {
        get { return positionName; }
        set { positionName = value; }
    }

    public ArrayList ArrPhone
    {
        get { return arrPhone; }
        set { arrPhone = value; }
    }



    // The function assigns all the variables associated to the employee to a new object.
    public static object DeepClone(object obj)
    {
        object objResult = null;
        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, obj);
            ms.Position = 0;
            objResult = bf.Deserialize(ms);
        }
        return objResult;
    }

   //Memento pattern is used to save the employee state.
   //The changes will be rolled back if the update button not clicked
    public class Memento : IMemento
    {
        private Employee originator = null;
        private int employeeID;
        private string firstName;
        private string lastName;
        private bool eligibleOT;
        private int positionID;
        private string positionName;
        private ArrayList arrPhone;
        private IList<Sector> arrSector;

        public Memento(Employee data)
        {
            this.employeeID = data.EmployeeID;
            this.firstName = data.FirstName;
            this.lastName = data.LastName;
            this.eligibleOT = data.EligibleOT;
            this.positionID = data.PositionID;
            this.positionName = data.PositionName;
            this.arrPhone = data.ArrPhone;

            this.originator = data;
            this.arrSector = Extensions.Clone<Sector>(data.ArrSector);
        }

}

Estoy utilizando do sostenido en WinForms. la parte delantera de mi aplicación tiene un cuadro de lista en el lado extremo izquierdo que tiene el primer nombre de la employee.on el lado izquierdo, hay diferentes cuadros de texto que se corresponden con el empleado seleccionado en el cuadro de lista. He codificado de una manera tal que cada vez que selecciono un empleado, sus atributos, como la identificación de empleado, nombre, posición, etc se muestran en estos campos.

si el usuario cambia cualquier atributo del empleado, tiene que hacer clic en un botón de actualización para realizar los cambios en la base de datos. ahora el problema real, cuando el usuario cambia cualquier campo del empleado seleccionado y selecciona otro empleado sin hacer clic en el botón de actualización, quiero mostrar un cuadro de pop-up para indicar al usuario que si se selecciona otro empleado, todos los cambios serán perdido.

Por esta razón he creado la clase Momento para mantener el estado anterior del empleado. también he intentado sobrecargar el operador ==

        public static bool operator ==(Employee e, Memento m)
        {
            return ((e.employeeID == m.employeeID) &&
               (e.firstName == m.firstName) &&
               e.lastName == m.lastName &&
               e.eligibleOT == m.eligibleOT &&
               e.positionID == m.positionID &&
               e.positionName == m.positionName &&
               e.arrPhone == m.arrPhone &&
               e.ArrSector == m.arrSector);
        }

        public static bool operator !=(Employee e, Memento m)
        {
            return (e.employeeID != m.employeeID);
        }

mi idea era comparar los dos objetos ... pero m no exitosa. ¿cómo lo hago ?? ¿Cómo puedo mostrar la ventana emergente si los cambios se made.?where Cómo coloco el código para mostrar la ventana emergente?

¿Fue útil?

Solución

Una palabra de advertencia ... no es generalmente una buena idea tener lógica diferente en sus == y != operadores. Es algo poco intuitivo para poder tener tanto == y != ser false al mismo tiempo.

if(!(a == b) && !(a != b))
{
    // head explodes
}

Aparte de eso, supongo que tienes tu clase Employee referenciado como un object (u otra clase padre) en su código de comparación. Tal vez algo como esto:

if(listBox1.SelectedItem != currentMemento)
{
    ...
}

Si este es el caso, entonces el compilador no es vinculante el != a su implementación personalizada. listBox1.SelectedItem moldeada a Employee con el fin de que la fuerza.

if((Employee)listBox1.SelectedItem != currentMemento)
{
    ...
}

Hay, sin embargo, muchos otros enfoques que usted puede tomar para resolver este problema:

  • Haga la aplicación en su totalidad en el lado de interfaz gráfica de usuario, con un bool que consigue ajustado a true cuando los datos en los campos de texto cambia, a continuación, compruebe que la bandera cuando se cambia empleados
  • Implementar las interfaces IComparable o IEquatable
  • Reemplazar el método Equals en la Employee y / o Memento clase

(Si vas con la segunda opción, generalmente se recomienda que complete la tercera también)

Ejemplo

Este es un ejemplo de lo que podría hacer (estoy suponiendo que tiene una ListBox listBox1 llamado y que ha adjuntado al evento SelectedIndexChanged con la función listBox1_SelectedIndexChanged):

private Employee lastSelectedEmployee;
private Memento selectedMemento;

void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    Employee selectedEmployee = (Employee)listBox1.SelectedItem;

    if(lastSelectedEmployee != null && lastSelectedEmployee != selectedEmployee)
    {
        if(/*changes exist*/)
        {
            if(/*cancel changes*/)
            {
                listBox1.SelectedItem = lastSelectedEmployee;

                return;
            }
        }
    }

    lastSelectedEmployee = selectedEmployee;
    selectedMemento = //create the memento based on selectedEmployee;
}

Se tendrá que proporcionar su propia lógica de las áreas que he dejado comentarios, pero la idea debe ser bastante sencillo.

Otros consejos

Tener un vistazo a la interfaz IComparable. Se requiere que usted para poner en práctica el método que necesita t hacer una comparación de este tipo. KB artículo , Es de esperar que a su vez Inglés para usted, en mi PC resulta siempre alemán.

-sa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top