首先要做的事情。 我有以下课程:
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);
}
我的想法是比较这两个对象...... 但是没有成功。我该怎么做?如果做出更改,我如何显示弹出窗口。我在哪里放置代码来显示弹出窗口?
答案 0 :(得分:2)
提醒一句......在==
和!=
运算符中使用不同的逻辑通常不是一个好主意。能够让==
和!=
同时成为false
有点不直观。
if(!(a == b) && !(a != b))
{
// head explodes
}
除此之外,我猜你在比较代码中将Employee
类引用为object
(或其他父类)。也许是这样的:
if(listBox1.SelectedItem != currentMemento)
{
...
}
如果是这种情况,则编译器不会将!=
绑定到您的自定义实现。将listBox1.SelectedItem
投射到Employee
以强制执行此操作。
if((Employee)listBox1.SelectedItem != currentMemento)
{
...
}
但是,您可以采取许多其他方法来解决此问题:
bool
设置为true
,然后在更改员工时检查该标志IComparable
或IEquatable
接口Equals
和/或Employee
类Memento
方法
(如果你选择第二个选项,通常建议你完成第三个选项)
示例强>
以下是您可以执行的操作的示例(我假设您有一个名为ListBox
的{{1}}并且您已使用listBox1
附加到SelectedIndexChanged
事件功能):
listBox1_SelectedIndexChanged
你必须为我留下评论的领域提供你自己的逻辑,但这个想法应该非常简单。
答案 1 :(得分:-1)
查看IComparable接口。它要求您实现您需要进行此类比较的方法。 KB article,希望它能为你翻译英语,在我的电脑上它总是变成德语。
-sa