2009-07-13 15 views
4

J'ai une application de formulaires Windows en C# et j'ai un formulaire que lorsque l'utilisateur ferme, je demande, "voulez-vous enregistrer les modifications"? Comment puis-je obtenir les changements dans mon formulaire? Voici quelques codes:Fermeture de formulaire enregistrer les modifications avant de fermer

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; 

      } 

     }   
} 

Il ya beaucoup de zones de texte et de listes déroulantes? Y a-t-il un autre moyen d'obtenir les changements dans le formulaire?

+0

Votre code semble OK. Quels problèmes avez-vous rencontré ?? –

+0

@ Meta-Knight De la dernière ligne, il semble qu'il demande comment vérifier les changements avec un grand nombre de contrôles sur un formulaire. – statenjason

Répondre

0

Eh bien, je pense que la théorie est bonne. Il y a quelques problèmes avec la mise en œuvre.

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

     e.Cancel = false; 

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

    } 

Je pense que ce serait beaucoup similier d'écrire ceci:

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

boucle les contrôles des formulaires et ajoutez vos observateurs d'événements. Ces événements appellent une fonction sous la forme qui maintiendra à jour un Hashtable ou une autre collection différente avec le statut de toute modification apportée à un contrôle particulier.

comme je l'ai, changements Hashtable;

puis chaque fois que mon événement est appelé, je dis, ajouter Control.Name, puis un statut de modification, ce que vous voulez. Ensuite, vous avez une liste de contrôles qui ont été mis à jour.

Je peux aller plus en détail si besoin est, j'espère que cela vous aidera à démarrer.

8

Beaucoup dépendra de l'endroit où l'information est conservée. Si vous utilisez DataBinding, vous devez surveiller l'événement listChanged ou appeler dataTable.GetChanges() si vous utilisez un DataTable. Si l'information provient d'une classe les implements ICloneable et IComparable, alors vous pouvez juste prendre une copie de sauvegarde lors de l'initialisation du formulaire (et après avoir sauvegardé) et lors de la fermeture vous préparez votre classe pour la sauvegarder et la comparer avec l'original .

Sinon, vous pouvez faire quelque chose comme

Déclarez une variable privée

private bool requiresSaving =false; 

déclarer un événement

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

Accrocher cet événement aux différents événements ont changé, par exemple

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

(L'événement réel est parfois appelé quelque chose de différent, par exemple ValueChanged, SelectedIndexChanged, mais ils peuvent tous les points à SomethingChanged sauf si vous avez besoin d'un événement particulier de faire quelque chose d'autre.)

Cocher cette variable lorsque vous fermez le formulaire

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

Vous devez également définir requiresSaving false dans la méthode saveDepart.J'ai également un code de type où, lorsque le contrôle est en cours d'initialisation, la valeur de l'étiquette est également définie et l'événement de fermeture boucle chaque contrôle et compare les valeurs d'origine (dans l'objet de l'étiquette) avec les valeurs actuelles.

3

Créez une chaîne (ou une chaîne [] je suppose) dans l'événement Form_Load et initialisez-les avec les valeurs présentes lors de l'ouverture initiale du formulaire. par exemple

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

Puis lors de l'événement Form_Closing(), vous pouvez vérifier ces contre les valeurs actuelles

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(); 
     } 
    } 
} 
Questions connexes