Custom Widget - Event Handler
I am developing a custom widget to display/manage podcasts. I am able to pull up the edit dialog box for the widget and have it display a list of podcasts in a repeater. However, when I click on the "Delete" button on one items, my RptPodcast_ItemCommand function is never hit. I am adding an event handler for this function in the InitializeControls method, but it seems to lose this association when the page is posted back. Any ideas why this code isn't firing?
Here is my repeater code:
<asp:Repeater ID="rptPodcast" runat="server"> <HeaderTemplate> <h2>Podcasts</h2> <table style="width:775px;"> </HeaderTemplate> <ItemTemplate> <tr> <td><b><span><%#Eval("Title") %></span></b></td> </tr> <tr> <td><span><%#Eval("Date") %></span></td> </tr> <tr> <td> <asp:LinkButton ID="btnDelete" runat="server" Text="Delete" CommandName="Delete" CommandArgument='<%#Eval("PodcastId") %>' /> </td> </tr> </ItemTemplate> <SeparatorTemplate> <tr><td><hr /></td></tr> </SeparatorTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Telerik.Sitefinity.Web.UI;using Telerik.Sitefinity.Web.UI.ControlDesign;namespace SitefinityWebApp.UserControls public class ViewPodcastManage : ContentViewDesignerView protected virtual Repeater RptPodcast get return base.Container.GetControl<Repeater>("rptPodcast", true); public override string ViewTitle get return "Podcast Manage"; public override string ViewName get return this.GetType().Name; protected override void InitializeControls(GenericContainer container) var ddlPodcast = container.GetControl<DropDownList>("PodcastName", true); using (var context = new Work.Business.Entities.EnterpriseEntities()) ddlPodcast.DataSource = from o in context.PodcastHeaders where o.Delete_Flag == false orderby o.Name select o; ddlPodcast.DataTextField = "Name"; ddlPodcast.DataValueField = "Id"; ddlPodcast.DataBind(); RptPodcast.ItemCommand += new RepeaterCommandEventHandler(RptPodcast_ItemCommand); protected override void OnPreRender(EventArgs e) base.OnPreRender(e); LoadPodcasts(); protected override void OnLoad(EventArgs e) base.OnLoad(e); protected void LoadPodcasts() using (var context = new Work.Business.Entities.EnterpriseEntities()) RptPodcast.DataSource = from p in context.Podcasts orderby p.Date descending select p; RptPodcast.DataBind(); protected override string LayoutTemplateName get return "SitefinityWebApp.UserControls.Podcast.UcViewPodcastManage.ascx"; public override IEnumerable<System.Web.UI.ScriptDescriptor> GetScriptDescriptors() var descriptor = new ScriptControlDescriptor(this.GetType().FullName, this.ClientID); return new[] descriptor ; public override IEnumerable<System.Web.UI.ScriptReference> GetScriptReferences() var assemblyName = this.GetType().Assembly.GetName().ToString(); var res = new List<System.Web.UI.ScriptReference> new ScriptReference("SitefinityWebApp.UserControls.Podcast.ViewPodcastManage.js", assemblyName) ; return res.ToArray(); protected void RptPodcast_ItemCommand(object source, RepeaterCommandEventArgs e) if (e.CommandName == "Delete" && e.CommandArgument.ToString() != "") using (var context = new Work.Business.Entities.EnterpriseEntities()) //TODO: Delete item instead of selecting it var deleteItem = (from p in context.Podcasts where p.PodcastId == new Guid(e.CommandArgument.ToString()) select p).First(); System.Diagnostics.Debug.WriteLine("Item to delete: " + deleteItem.Title); //Re-bind the repeater after deleting the podcast item //LoadPodcasts(); Try moving your
RptPodcast.ItemCommand += new RepeaterCommandEventHandler(RptPodcast_ItemCommand);
Line into your OnLoad function. I'm not sure where InitializeControls falls in the page lifecycle, but it will need to be before the PreRender event.
Thanks,
Chris
Hi Chris,
Thank you for your suggestion. I tried moving the line that you mentioned to the OnLoad function, but still can't seem to get my itemcommand code to fire. I stepped through the code and verified that the InitializeControls function is fired before the PreRender event. Any other ideas?
Thanks,
Dustin
Any luck with this ? I am also having same issue.
Hi all,
I have tested your control and it works fine on my end. The command is fired and I am able to get the command argument. Please, make sure that your page where the widget is placed, has Viewstate enabled.
Regards,
Nikola Zagorchev
Telerik