ASP HiddenField ValueChanged handler fires on every postback in custom control
<p>I'm having problems with event handlers always firing on HiddenFields despite no changes to the field that I'm aware of.</p>

<p>I have an ASCX user control where I statically declare some elements:</p>

<p>MyControl.ascx:</p>

<pre><code>&lt;div id="AnItem" runat="server"&gt;
   &lt;asp:Textbox id="TextBox1" runat="server" /&gt;
   &lt;asp:HiddenField id="HiddenField1" runat="server" /&gt;
&lt;/div&gt;
</code></pre>

<p>(There's obviously a lot more there, but this is the markup of note)</p>

<p>MyControl.ascx.cs:</p>

<pre><code>protected override void OnInit(EventArgs e){
    base.OnInit(e);
    if (SelectedValue != null){
        TextBox1.Text = SelectedValue.Text;
        HiddenField1.Value = SelectedValue.ID.ToString();
    }
}

protected override void OnLoad(EventArgs e){
    base.OnLoad(e);
    if (String.IsNullOrEmpty(TextBox1.Text))
        TextBox1.Attributes["style"] = "display:none";
    TextBox1.TextChanged += ItemTouched;
    HiddenField1.ValueChanged += ItemTouched;
}

protected void ItemTouched(object sender, EventArgs e){
    // process changed values
}
</code></pre>

<p>The code seems unconventional because I've omitted items unrelated (I assume) to my question.</p>

<p>My control is actually created dynamically using a wrapper class that I can serialize:</p>

<pre><code>[Serializable]
public class ListControl{
    public void GenerateControl(TemplateControl parent){
        var control = parent.LoadControl("~/MyControl.ascx") as MyControl;
        control.Options = _options;
        control.SelectedValue = _selectedValue;
        return control;     
    }

    private IList&lt;SelectableOption&gt; _options;
    private SelectionOption _selectedValue;
}
</code></pre>

<p>(The reasons for this wrapper are due to a large legacy code base that is too slow in creating the list of selectable values. The _options list is generated once and then kept in the session to speed up postback execution.)</p>

<p>ItemTouched is attached to every element that may be touched by the user (or manipulated by JavaScript). My problem is that it's being fired on every postback - even when HiddenField1 wasn't modified on the client side (I've confirmed this by removing all JavaScript that touched it).</p>

<p>I'm at a loss as to why the handler is being fired is the value isn't being touched. It does not fire when the control values aren't set (e.g. in my OnInit method), but always does if they are "pre-set". I don't expect the change handlers to fire if I attach the event handlers <em>after</em> setting the default values, but this doesn't seem to be the case. Am I making a fundamentally bad assumptions about ASP.NET events?</p>
