2009-07-13 4 views
4

У меня есть приложение Windows Forms на C#, и у меня есть форма, когда пользователь закрывает его, я спрашиваю: «Вы хотите сохранить изменения»? Как я могу получить изменения в моей форме? Вот какой-то код:Закрытие формы сохраняет изменения перед закрытием

public partial class DepartEdit : Form 
{ 
    string _nameDep; //This variavel get value textbox when form load 

    { 
     InitializeComponent(); 
    } 
    private void DepartamentEdit_FormClosing(object sender, FormClosingEventArgs e) 
    { 


     if (txtNameDepart.Text != _nameDep && codDepartament > 0)//Here i compare 
     { 
      DialogResult dlg = MessageBox.Show("Save changes?", "Question", MessageBoxButtons.YesNo); 

      if (dlg == DialogResult.Yes) 
      { 
       saveDepart(); // Metod save depart 

       e.Cancel = false; 

      } 
      if(dlg ==DialogResult.No) 
      { 
       e.Cancel = false; 

      } 

     }   
} 

Есть много текстовых полей и комбинированных ящиков? Есть ли другой способ получить изменения в форме?

+0

Ваш код кажется OK. Какие проблемы вы столкнулись? –

+0

@ Мета-рыцарь. Из последней строки, похоже, он спрашивает, как проверить изменения с большим количеством элементов управления в форме. – statenjason

ответ

0

Ну, я думаю, что теория хороша. Есть некоторые проблемы с реализацией.

if (dlg == DialogResult.Yes) 
    { 
     saveDepart(); // Metod save depart 

     e.Cancel = false; 

    } 
    if(dlg ==DialogResult.No) 
    { 
     e.Cancel = false; 

    } 

Я думаю, что это было бы намного similier написать это:

if(dlg == DialogResult.Yes) 
    { 
      saveDepart(); 
    } 
    // You don't need to change e.Cancel to false here unless you set it to true previously. 
1

Петлевые элементы управления формы и добавлять наблюдателей событий. Эти события вызовут функцию в форме, которая будет обновлять Hashtable или другую другую коллекцию с статусом любых изменений в конкретном элементе управления.

как у меня, изменения Hashtable;

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

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

8

Многое будет зависеть от того, где хранится информация.

Это вы используете DataBinding, вы должны просто следить за событием listChanged или вызывать dataTable.GetChanges(), если используете DataTable.

Если информация поступает из класса, то реализуется ICloneable и IComparable, тогда вы можете просто взять резервную копию при интилиализации формы (и после сохранения), а при закрытии вы подготовите класс для сохранения и сравните его с оригиналом ,

В противном случае вы можете сделать что-то вроде

Объявите приватный переменную

private bool requiresSaving =false; 

Объявите событие

private void SomethingChanged(object sender, EventArgs e) 
{ 
     requiresSaving = true; 
} 

Подключайте это событие к различным изменившимся событиям, например

this.txtNameDepart.TextChanged += new System.EventHandler(this.SomethingChanged); 

(Реальное событие иногда называют что-то другое, например, ValueChanged, SelectedIndexChanged, но они могут все пункты SomethingChanged, если вам нужно конкретное событие, чтобы сделать что-то еще.)

Проверить эту переменную, когда вы закрываете форму

private void DepartamentEdit_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (requiresSaving) 
    { 
     .... 

Вам также необходимо установить requireSaving false в методе saveDepart.

В качестве альтернативы у меня есть код, где, когда элемент управления инициализируется, также устанавливается значение тега, а событие formclosing проходит через каждый элемент управления и сравнивает исходные значения (в объекте тега) с текущими значениями.

3

Создайте строку (или строку [], я думаю) в событии Form_Load и инициализируйте их значениями, присутствующими при первом открытии формы. например

string oName = nameTextBox.Text; 
string oCompany = companyComboBox.Text; 

Тогда в ходе мероприятия Form_Closing() вы можете проверить это по отношению к текущим значениям

private void Contact_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (oName!=nameTextBox.Text||oCompany!=companyComboBox.Text) 
    { 
     DialogResult result = MessageBox.Show("Would you like to save your changes", 
      "Save?", 
      MessageBoxButtons.YesNoCancel, 
      MessageBoxIcon.Stop); 
     if (result == DialogResult.Yes) 
     { 
      SaveFormValues(); 
     } 
     else if (result == DialogResult.Cancel) 
     { 
      // Stop the closing and return to the form 
      e.Cancel = true; 
     } 
     else 
     { 
      this.Close(); 
     } 
    } 
} 
Смежные вопросы