당신이하려는 일을하기 위해서는 훨씬 간단한 방법이 있습니다 : "수정 된"깃발이나 이벤트를 사용하십시오.
필요한 경우 여러 수준의 사용자 컨트롤을 계단식으로 연결할 수 있습니다.
그런 다음 실제로 수정 사항을 확인해야하는 모든 이벤트를 후크하십시오.
public class MainForm : Form
{
private bool isDataModified;
public MainForm()
{
InitializeComponent();
textBox1.TextChanged += DataModified;
textBox2.TextChanged += DataModified;
// etc.
userControl1.Modified += DataModified;
userControl2.Modified += DataModified;
// etc.
}
private void DataModified(object sender, EventArgs e)
{
isDataModified = true;
}
}
그런 다음 당신이해야 할 검사입니다 (리셋) 따라 isDataModified
플래그.
정말 많은 작업이 아니며 그래프의 모든 개체에 대해 INotifyPropertyChanged
이 구현되도록하는 것보다 쉽습니다. 이 형식 일 뿐이며 오브젝트이 변경되었다는 사실을 염려하지 않으시 고 사용자이 변경되면 실제로 변경 사항을 확인하고 싶습니다.
그래, 완벽하지는 않습니다. 사용자가 무언가를 변경하고 다시 변경하더라도 데이터가 변경되었다는보고는 사소한 불편을 겪습니다. 그러나 나는 이것에 대한 불만을 실제로들은 적이 없다고 생각합니다. 그리고 직렬화를 비교 방법으로 사용하는 것은 신뢰할 만합니다. 여분의 저장 확인을 제거하려면 실제로 그래프의 모든 오브젝트에 대해 Equals
메소드를 대체하고 실제 값 동등성 조작을 구현해야합니다. 또는 오래된 그래프의 복사본을 유지하지 않으려면 체크섬 생성 함수를 사용하십시오 (충돌은 가능하지만 매우 드뭅니다).
하지만 나는 깃발을 붙잡을뿐입니다. 평등성 수표를 작성하는 길을 사기려고하지 마십시오. 실제로 자동 딥 복제 방법을 쓰는 것과 똑같습니다. 당신은 시도 할 수 있습니다. 그러나 당신이 생각해내는 것은 무엇이든 가끔 깨질 것입니다.
모든 답변을 주셔서 감사합니다. IsDirty 방법을 알고 있지만이 작업을 수행 할 수있는 다른 방법이 있는지 궁금해하고 있습니다. 이제는 XML로 객체를 직렬화하면 더욱 신뢰할 수있는 방법이 될 것입니다. – sev7n