Сравнение двух состояний объекта, до и после обновления - PullRequest
1 голос
/ 28 января 2010

обо всем по порядку. У меня есть следующие классы:

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

}

Я использую C sharp в winforms. на передней части моего приложения есть список с левой стороны, который имеет имя сотрудника. с левой стороны, есть различные текстовые поля, которые соответствуют сотруднику, выбранному в списке. Я закодировал его таким образом, чтобы каждый раз, когда я выбирал сотрудника, его атрибуты, такие как идентификатор сотрудника, имя, должность и т. Д., Отображались в этих полях.

если пользователь изменяет какой-либо атрибут сотрудника, он должен нажать кнопку обновления, чтобы внести изменения в базу данных. Теперь настоящая проблема, когда пользователь меняет любое поле выбранного сотрудника и выбирает другого сотрудника, не нажимая кнопку обновления, я хочу показать всплывающее окно, сообщающее пользователю, что если он выберет другого сотрудника, все изменения будут потерял.

по этой причине я создал класс momento для хранения предыдущего состояния работника. я также пытался перегрузить оператор ==

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

Моя идея состояла в том, чтобы сравнить два объекта ... но я не удалась. Как мне это сделать? Как я могу показать всплывающее окно, если внесены изменения.? Где я могу разместить код для показа всплывающего окна?

Ответы [ 2 ]

2 голосов
/ 28 января 2010

Одно слово предупреждения ... как правило, не стоит иметь другую логику в ваших == и != операторах. Несколько бессмысленно иметь возможность одновременно и ==, и != быть false.

* +1007 *

Кроме того, я предполагаю, что у вас есть Employee класс, на который ссылается как object (или другой родительский класс) в вашем коде сравнения. Может быть, что-то вроде этого:

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

Если это так, то компилятор не привязывает != к вашей пользовательской реализации. Приведите listBox1.SelectedItem к Employee, чтобы форсировать это.

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

Однако существует много других подходов, которые вы можете использовать для решения этой проблемы:

  • Сделайте реализацию полностью на стороне графического интерфейса, с bool, который устанавливается в true при изменении данных в текстовых полях, затем отметьте этот флаг при смене сотрудников
  • Реализация интерфейсов IComparable или IEquatable
  • Переопределить метод Equals для Employee и / или Memento класса

(Если вы выберете второй вариант, обычно рекомендуется также завершить третий)

* Пример 1 040 *

Вот пример того, что вы можете сделать (я предполагаю, что у вас есть ListBox с именем listBox1, и вы присоединились к событию SelectedIndexChanged с помощью функции 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;
}

Вы должны будете предоставить свою собственную логику для областей, в которых я оставил комментарии, но идея должна быть довольно простой.

0 голосов
/ 28 января 2010

Посмотрите на интерфейс IComparable. Это требует от вас реализации метода, который вам нужен, чтобы сделать такое сравнение. KB article , Надеюсь, он станет для вас английским, на моем компьютере он всегда будет немецким.

-sa

...