views:

55

answers:

3

Hi.

I have application full of various controls databound to my classes. I would like to ask user "You are closing application and you made some changes. Do you want to save your changes?". For this I need to recognize that user made any changes.

How to catch user made changes in databound controls? Is textBoxXXX_TextChanged the only way to do this?

Thanks in advance for all your answers.

+2  A: 

It depends on the datasource; for example DataTable and DataSet sources contain the GetChanges() methods which allow you to easily see if rows have been added/removed/modified. Other data sources will have their own implementations, if any. If there is no implementation then it's up to you to determine how to check for those changes.

In any event this is something you should do at the data-level, not the UI (by watching for "changed" events). Watching events doesn't scale beyond a couple controls and maintenance can be iffy.


Update: Not sure why I didn't think of it, but a second option is to add a BindingSource to your UI object and use it as a databinding proxy (your UI controls databind to the BindingSource and the BindingSource binds to the real datasource). It provides a better approach than handling all your individual "Control_Changed" events, and requiring rework of your other layers (esp. if they aren't custom data-types).

STW
+1  A: 

You need to provide custom logic for that, there's not really an automatic way of doing this. As I see it there are several options:

  1. At the start of the editing, save a copy of the original data object, and when you need to check, compare the current object with the saved one. The comparison can be custom (field by field) or semi-automatic by use of serialization (compare the serialized forms) - if it is serializable.
  2. In each of your data object's property set accessors, test for a change in value and mark the object as 'dirty'.
Aviad P.
A: 

As been discussed, there are many ways to do this depending on how granular you want to get.

A relatively easy way using client side javascript would be to do something like the following:

  1. Hook into the onchange events of the form elements. You could do this dynamically on page load using javascript/DOM.
  2. When the onchange error handler is called, you could set a page level variable: pageHasChanged = true;
  3. Hook into the page's beforeonunload event (occurs when the user tries to navigate away from the page) and check the pageHasChanged variable to see if any changes were made. If changes were made you could alert the user.

This doesn't give you the detail of what changed, but would be fairly easy to modify to track which form elements changed.

WayneC