DGibbs
DGibbs

Reputation: 14608

Raising an event from usercontrol and notifying subscribers

I have a usercontrol DmsRegisterPod which is being output within a repeater which is itself, inside an UpdatePanel. I have an event on the DmsRegisterPod called OnUpdated which I'm subscribing to in the repeaters ItemDataBound event e.g:

protected void rptPendingDmsRequests_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DealershipIRLink irLink = (DealershipIRLink)e.Item.DataItem;
        DmsRegisterPod dmsRegisterPod = (DmsRegisterPod)e.Item.FindControl("ucDmsRegisterPod");
        dmsRegisterPod.ValidationGroup = string.Format("dms-pod-{0}", e.Item.ItemIndex);
        dmsRegisterPod.DealershipIRLink = irLink;
        dmsRegisterPod.OnUpdated += dmsRegisterPod_OnUpdated;
    }
}

private void dmsRegisterPod_OnUpdated(object sender, EventArgs e)
{
    this.DataBind();
}

The event is setup as such in the usercontrol:

public event EventHandler OnUpdated;

private void Updated(EventArgs e)
{
    if (this.OnUpdated != null)
    {
        OnUpdated(this, e);
    }
}

It's being raised in the Accept click handler:

protected void btnAccept_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        this.DealershipIRLink.dms_account_number = txtDmsNumber.Text;

        this.DealershipIRLink.id_dealer_ir_link_status = DealerIRLinkStatus.DealerIRLinkStatusIdentifier.Approved;

        this._irLinkService.UpdateDealershipIRLink(this.DealershipIRLink);

        this.Updated(e);
    }
}

However, the handler, OnUpdated is always null so the event never gets raised. It's as though the control is losing the event binding somehow. Can anybody see what I've done wrong here?

Upvotes: 1

Views: 475

Answers (1)

Tim Schmelter
Tim Schmelter

Reputation: 460018

Register the event handler in ItemCreated instead of ItemDataBound which is triggered only when you databind the control and not on every postback(required):

protected void rptPendingDmsRequests_ItemCreated(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DmsRegisterPod dmsRegisterPod = (DmsRegisterPod)e.Item.FindControl("ucDmsRegisterPod");
        dmsRegisterPod.OnUpdated += dmsRegisterPod_OnUpdated;
    }
}

All other logic that depends on the datasource belongs to ItemDataBound:

protected void rptPendingDmsRequests_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DealershipIRLink irLink = (DealershipIRLink)e.Item.DataItem;
        DmsRegisterPod dmsRegisterPod = (DmsRegisterPod)e.Item.FindControl("ucDmsRegisterPod");
        dmsRegisterPod.ValidationGroup = string.Format("dms-pod-{0}", e.Item.ItemIndex);
        dmsRegisterPod.DealershipIRLink = irLink;
    }
}

Upvotes: 1

Related Questions