madcapnmckay
madcapnmckay

Reputation: 15984

Asp.net Event for change tracking of entities

I have an asp.net page with many dozens of controls representing multiple database entities. I would like to track when any of the data for these entities is changed.

If I add a page member such as

public Page1 : System.Web.UI.Page
{
    protected bool Entity1HasChanged { get;set; }

    protected void RegisterChange(object sender, EventArgs e)
    {
        Entity1HasChanged  = true;
    }
}

Then for each control OnTextChanged event or equivalent I call a method that sets this boolean to true.

I would then like to run a method AFTER all control events have completed which does some database updates. What page event can I hook into to do this? Reading the page on the LoadComplete event it only states that all load events will have completed.

Does anyone know how I should achieve this? Am I doing this completely the wrong way?

Thanks,

Ian

Upvotes: 1

Views: 337

Answers (3)

Daryl
Daryl

Reputation: 138

This is a really good question. I messed around with something quick that I think will work. You could create your won TextBox that inherits from TextBox:

namespace ServerControl1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
    public class TextBoxWithChange : TextBox
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public bool HasEntityChanged
        {
            get
            {
                bool hasEntityChanged = (bool) ViewState["HasEntityChanged"];
                return hasEntityChanged;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

Then you could write a little jQuery script to change that attribute when the client side OnTextChanged event fires. On submit of the form you then could query that HasEntityChanged attribute for any of these TextBoxes.

For this example I put the server control in it's own Library and registered it like this:

<%@ Register TagPrefix="MyCompanyName" Namespace="ServerControl1" Assembly="ServerControl1" %>

Then you can declare it on your page like this:

    <MyCompanyName:TextBoxWithChange ID="ChangerTextBox" runat="server" HasEntityChanged="false"></MyCompanyName:TextBoxWithChange>

Upvotes: 1

gerrod
gerrod

Reputation: 6627

Try OnPreRender.

ASP.NET Page Life Cycle Overview

This will also still allow you to modify the page output once you've completed the database operations (e.g. if you want to show a status box to say that the operations completed).

Upvotes: 1

Perpetualcoder
Perpetualcoder

Reputation: 13571

Look at INotifyProperyChanged, INotifyPropertyChanging and INotifyCollectionChanged as your starting point.

Upvotes: 3

Related Questions