比较更新前后两个对象的状态

发布于 2024-08-19 19:54:28 字数 4489 浏览 3 评论 0原文

首先要事。 我有以下课程:

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

}

我在 winforms 中使用 C Sharp。我的应用程序的前端在左侧有一个列表框,其中包含员工的名字。在左侧,有不同的文本框,与列表框中选择的员工相对应。我以这样的方式对其进行编码,每次选择一名员工时,其属性(例如员工 ID、姓名、职位等)都会显示在这些字段中。

如果用户更改员工的任何属性,他必须单击更新按钮才能对数据库进行更改。 现在真正的问题是,当用户更改所选员工的任何字段,并在没有单击更新按钮的情况下选择另一个员工时,我想显示一个弹出框来告诉用户,如果他选择另一个员工,则所有更改都将是丢失的。

因此,我创建了 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);
        }

我的想法是比较两个对象...... 但我没有成功。我该怎么做?如果进行更改,我如何显示弹出窗口?我在哪里放置代码来显示弹出窗口?

first things first.
I have the following classes:

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

}

I am using C sharp in winforms. the front end of my application has a listbox on the left end side which has the first name of the employee.on the left hand side, there are different textboxes which correspond to the employee selected in the list box. I have coded it in such a way that everytime i select an employee, its attributes, like the employee id, name, position, etc are displayed in these fields.

if the user changes any attribute of the employee, he has to click an update button to make the changes to the database.
now the real problem, when the user changes any field of the selected employee, and selects another employee without clicking the update button, i want to show a pop up box to tell the user that if he selects another employee , all the changes will be lost.

for this reason i have created the momento class to hold the previous state of the employee.
i have also tried overloading the == operator

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

my idea was to compare the two object...
but m not successfull. how do i do it??how do i show the popup if changes are made.?where do i place the code to show the popup?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扎心 2024-08-26 19:54:28

警告一句……在 ==!= 运算符中使用不同的逻辑通常不是一个好主意。能够同时让 ==!=false 有点不直观。

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

除此之外,我猜测您的 Employee 类在比较代码中被引用为 object (或其他父类)。也许是这样的:

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

如果是这种情况,那么编译器不会将 != 绑定到您的自定义实现。将 listBox1.SelectedItem 强制转换为 Employee 以强制执行此操作。

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

但是,您可以采取许多其他方法来解决此问题:

  • 完全在 GUI 端实现,使用 bool 当文本字段中的数据发生变化,然后在更改员工时检查该标志
  • 实现 IComparableIEquatable 接口
  • 重写 上的 Equals 方法Employee 和/或 Memento

(如果您选择第二个选项,通常建议您也完成第三个选项)

示例

以下是一个示例你可以这样做(我假设你有一个名为 listBox1ListBox 并且你已经使用 listBox1_SelectedIndexChanged 附加到 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;
}

您必须为我留下评论的区域提供您自己的逻辑,但这个想法应该非常简单。

One word of warning...it's generally not a good idea to have different logic in your == and != operators. It's somewhat unintuitive to be able to have both == and != be false at the same time.

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

That aside, I'm guessing that you have your Employee class referenced as an object (or other parent class) in your comparison code. Maybe something like this:

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

If this is the case, then the compiler isn't binding the != to your custom implementation. Cast listBox1.SelectedItem to Employee in order to force that.

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

There are, however, many other approaches that you could take to solve this issue:

  • Make the implementation entirely on the GUI side, with a bool that gets set to true when the data in the text fields changes, then check that flag when changing employees
  • Implement the IComparable or IEquatable interfaces
  • Override the Equals method on the Employee and/or Memento class

(If you go with the second option, it's generally recommended that you complete the third as well)

Example

Here's an example of what you could do (I'm assuming you have a ListBox named listBox1 and you've attached to the SelectedIndexChanged event with the listBox1_SelectedIndexChanged function):

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

You'll have to provide your own logic for the areas I've left comments, but the idea should be pretty straightforward.

半边脸i 2024-08-26 19:54:28

看一下 IComparable 接口。它要求你实现你不需要进行这样的比较的方法。 知识库文章,希望它能为您变成英语,在我的电脑上它总是变成德语。

-sa

Have a look at the IComparable interface. It requires you to implement the method you need t make such a comparison. KB article, Hopefully it turn English for you, on my PC it turns always German.

-sa

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文