Note that there are some explanatory texts on larger screens.

plurals
  1. PONested Control Accordion < Accordion < ListView ItemEditing Issue
    text
    copied!<p>Got a question, and I'm quite baffled as to why it is not working. I have a ListView control nested within an AJAX Accordion, which is nested inside another AJAX Accordion.</p> <p>i.e. Accordion1 &lt; Accordion2 &lt; ListView</p> <p>All of these controls are databound in code-behind.</p> <p>I've currently implemented a method that allows me to edit the contents of any ListView, but this only works in the first pane of Accordion1. Every record, as long as it is in the first pane of Accordion1 can be edited without any problems.</p> <p>When I click my Edit button in the ListView when it is in any other pane of Accordion1, it does not change the ListView to the EditItemTemplate. I thought this might be a naming issue with the UniqueID assigned to the ListViews, but they are different (albeit not by much).</p> <blockquote> <p>((System.Web.UI.Control)(lSender)).UniqueID "ctl00$MainContent$ticketAccordion$acc_ticketTypeAccordion_Pane_0_content$acc_ticketAccord>ion_Pane_0_content$LV_ticketDataListview" string</p> <p>((System.Web.UI.Control)(lSender)).UniqueID "ctl00$MainContent$ticketAccordion$acc_ticketTypeAccordion_Pane_1_content$acc_ticketAccord>ion_Pane_0_content$LV_ticketDataListview" string</p> </blockquote> <p>Here is my code for the control:</p> <pre><code>&lt;%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TicketAccordion.ascx.cs" Inherits="GSWebApp.UserControls.TicketAccordion" %&gt; &lt;ajaxToolkit:Accordion ID="acc_ticketTypeAccordion" runat="server" RequireOpenedPane="false" OnItemDataBound="acc_ticketTypeAccordion_ItemDataBound"&gt; &lt;HeaderTemplate&gt; &lt;asp:Label ID="Lbl_statName" runat="server" Text='&lt;%# Eval("StatName") %&gt;'&gt;&lt;/asp:Label&gt; &lt;asp:HiddenField ID="Hdn_statID" runat="server" Value='&lt;%# Eval("StatID") %&gt;' /&gt; &lt;asp:Label ID="Lbl_statCount" runat="server"&gt;&lt;/asp:Label&gt; &lt;/HeaderTemplate&gt; &lt;ContentTemplate&gt; &lt;asp:HiddenField ID="Hdn_statID" runat="server" Value='&lt;%# Eval("StatID") %&gt;' /&gt; &lt;ajaxToolkit:Accordion ID="acc_ticketAccordion" runat="server" RequireOpenedPane="false" OnItemDataBound="ticketAccordion_ItemDataBound"&gt; &lt;HeaderTemplate&gt; &lt;table class="TicketAccordionTable"&gt; &lt;tr&gt; &lt;td class="FLoatLeft"&gt; &lt;asp:Label ID="Lbl_ticketID" runat="server" Text='&lt;%# "Ticket Ref# " + Eval("SupportTicketID") + " - " %&gt;' CssClass="TLabel"&gt;&lt;/asp:Label&gt; &lt;asp:Label ID="Lbl_ticketSumm" runat="server" Text='&lt;%# Eval("SupportSummary") %&gt;' CssClass="TLabel"&gt;&lt;/asp:Label&gt; &lt;/td&gt; &lt;td class="FloatRight"&gt; &lt;asp:Label ID="Lbl_ticketDateLog" runat="server" Text='&lt;%# Eval("DateLogged", "{0:dd/MM/yy HH:mm:ss}") %&gt;' CssClass="TLabel"&gt;&lt;/asp:Label&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/HeaderTemplate&gt; &lt;ContentTemplate&gt; &lt;asp:UpdatePanel ID="UpdPnl_ticketData2" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true"&gt; &lt;ContentTemplate&gt; &lt;asp:HiddenField ID="Hdn_supportTicketID" runat="server" Value='&lt;%# Eval("SupportTicketID") %&gt;' /&gt; &lt;asp:ListView ID="LV_ticketDataListview" runat="server" DataKeyNames="SupportTicketID" ItemPlaceholderID="itemPlaceholder" OnItemEditing="LV_ticketDataListview_ItemEditing" OnItemCanceling="LV_ticketDataListview_ItemCanceling" OnItemInserting="LV_ticketDataListview_ItemInserting" OnItemUpdating="LV_ticketDataListview_ItemUpdating" OnItemDeleting="LV_ticketDataListview_ItemDeleting"&gt; &lt;LayoutTemplate&gt; &lt;table class="TicketListViewTable"&gt; &lt;asp:PlaceHolder ID="itemPlaceholder" runat="server"&gt;&lt;/asp:PlaceHolder&gt; &lt;/table&gt; &lt;footer&gt; &lt;asp:Button ID="Btn_editTicketData" runat="server" Text="New Reply" CssClass="TLVButton" OnClick="Btn_editTicketData_Click" /&gt; &lt;asp:Button ID="Btn_deleteTicketData" runat="server" CommandName="Delete" Text="Delete Ticket" OnClientClick="if(!confirm('Are you sure you want to delete this ticket?')) return false;" CssClass="TLVButton" /&gt; &lt;/footer&gt; &lt;/LayoutTemplate&gt; &lt;ItemTemplate&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:Label ID="Lbl_LV_ticketLog" runat="server" Text='&lt;%# "Logged By: " + Eval("LoggedByEmployeeName") + " - " + Eval("TimeStamp") %&gt;' CssClass="TLabelLog"&gt;&lt;/asp:Label&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:Label ID="Lbl_LV_ticketMessage" runat="server" Text='&lt;%# Eval("MessageLog") %&gt;' CssClass="TLabel"&gt;&lt;/asp:Label&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:Button ID="Btn_editTicketData" runat="server" CommandName="Edit" CommandArgument='&lt;%# Eval("SupportTicketID") %&gt;' Text="Edit" CssClass="TLVButton" /&gt; &lt;asp:Button ID="Btn_deleteTicketData" runat="server" CommandName="Delete" Text="Delete" CssClass="TLVButton" /&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/ItemTemplate&gt; &lt;EditItemTemplate&gt; &lt;asp:HiddenField ID="Hdn_supportTicketDataID" runat="server" Value='&lt;%# Eval("SupportTicketDataID") %&gt;' /&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:Label ID="Lbl_LV_ticketLog" runat="server" Text='&lt;%# "Logged By: " + Eval("LoggedByEmployeeName") + " - " + Eval("TimeStamp") %&gt;' CssClass="TLabelLog"&gt;&lt;/asp:Label&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:TextBox ID="Tb_LV_ticketMessage" runat="server" Text='&lt;%# Eval("MessageLog") %&gt;' CssClass="TLabel"&gt;&lt;/asp:TextBox&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:Button ID="Btn_saveTicketData" runat="server" CommandName="Update" Text="Save" CssClass="TLVButton" /&gt; &lt;asp:Button ID="Btn_cancelTicketData" runat="server" CommandName="Cancel" Text="Cancel" CssClass="TLVButton" /&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/EditItemTemplate&gt; &lt;InsertItemTemplate&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:TextBox ID="Tb_LV_ticketMessage" runat="server" CssClass="TLabel"&gt;&lt;/asp:TextBox&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;asp:Button ID="Btn_saveTicketData" runat="server" CommandName="Insert" Text="Save" CssClass="TLVButton" /&gt; &lt;asp:Button ID="Btn_cancelTicketData" runat="server" CommandName="Cancel" Text="Cancel" CssClass="TLVButton" /&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/InsertItemTemplate&gt; &lt;ItemSeparatorTemplate&gt; &lt;/ItemSeparatorTemplate&gt; &lt;/asp:ListView&gt; &lt;/ContentTemplate&gt; &lt;/asp:UpdatePanel&gt; &lt;/ContentTemplate&gt; &lt;/ajaxToolkit:Accordion&gt; &lt;/ContentTemplate&gt; &lt;/ajaxToolkit:Accordion&gt; </code></pre> <p>And here is my code-behind:</p> <pre><code>public partial class TicketAccordion : System.Web.UI.UserControl { GSWIISAService.GSWebServiceClient serviceClient; List&lt;SupportTicket&gt; ticketHoldList; List&lt;SupportTicketData&gt; ticketDataHoldList; protected void Page_Load(object sender, EventArgs e) { serviceClient = new GSWIISAService.GSWebServiceClient(); BindLists(1006); BindAccTicketAccordion(); } private void BindLists(int _clientRef) { ticketHoldList = serviceClient.GetSupportTicketsByReference(_clientRef).ToList(); ticketDataHoldList = serviceClient.GetSupportTicketDataByRefID(_clientRef).ToList(); } private void BindAccTicketAccordion() { acc_ticketTypeAccordion.DataSource = (from c in ticketHoldList select new { StatID = c.StatusID, StatName = c.Status }).Distinct().ToList(); acc_ticketTypeAccordion.DataBind(); } protected void ticketAccordion_ItemDataBound(object sender, AccordionItemEventArgs e) { if (e.ItemType == AccordionItemType.Content) { HiddenField hdnID = (HiddenField)e.AccordionItem.FindControl("Hdn_supportTicketID"); int ID = int.Parse(hdnID.Value); ListView ticketListview = (ListView)e.AccordionItem.FindControl("LV_ticketDataListview"); ticketListview.DataSource = ticketDataHoldList.Where(p =&gt; p.SupportTicketID == ID); ticketListview.DataBind(); } } protected void acc_ticketTypeAccordion_ItemDataBound(object sender, AccordionItemEventArgs e) { if (e.ItemType == AccordionItemType.Header) { HiddenField hdnStatID = (HiddenField)e.AccordionItem.FindControl("Hdn_statID"); int statID = int.Parse(hdnStatID.Value); Label statCount = (Label)e.AccordionItem.FindControl("Lbl_statCount"); statCount.Text = " (" + ticketHoldList.Where(p =&gt; p.StatusID == statID).Count().ToString() + ")"; } if (e.ItemType == AccordionItemType.Content) { HiddenField hdnStatID = (HiddenField)e.AccordionItem.FindControl("Hdn_statID"); int statID = int.Parse(hdnStatID.Value); Accordion accTicketAccordion = (Accordion)e.AccordionItem.FindControl("acc_ticketAccordion"); accTicketAccordion.DataSource = ticketHoldList.Where(p =&gt; p.StatusID == statID); accTicketAccordion.DataBind(); } } protected void LV_ticketDataListview_ItemEditing(object sender, ListViewEditEventArgs e) { ListView lSender = (ListView)sender; lSender.EditIndex = e.NewEditIndex; HiddenField hdnSupportTicketID = (HiddenField)lSender.Parent.FindControl("Hdn_supportTicketID"); lSender.DataSource = ticketDataHoldList.Where(p =&gt; p.SupportTicketID == int.Parse(hdnSupportTicketID.Value)); lSender.DataBind(); } protected void LV_ticketDataListview_ItemCanceling(object sender, ListViewCancelEventArgs e) { ListView lSender = (ListView)sender; lSender.EditIndex = -1; lSender.InsertItemPosition = InsertItemPosition.None; lSender.DataBind(); } protected void LV_ticketDataListview_ItemInserting(object sender, ListViewInsertEventArgs e) { } protected void LV_ticketDataListview_ItemUpdating(object sender, ListViewUpdateEventArgs e) { ListView lSender = (ListView)sender; HiddenField hdnSupportTicketDataID = (HiddenField)lSender.Items[e.ItemIndex].FindControl("Hdn_supportTicketDataID"); TextBox tbMessage = (TextBox)lSender.Items[e.ItemIndex].FindControl("Tb_LV_ticketMessage"); SupportTicketDataEntity entity = new SupportTicketDataEntity(); int stDataID = int.Parse(hdnSupportTicketDataID.Value); entity.SupportTicketDataID = stDataID; entity.MessageLog = tbMessage.Text; entity.Edited = true; //entity.EditedByID = Page.User.Identity.Name; entity.EditTimeStamp = DateTime.Now; serviceClient.UpdateSupportTicketData(entity); BindLists(1006); BindAccTicketAccordion(); //lSender.DataBind(); } protected void LV_ticketDataListview_ItemDeleting(object sender, ListViewDeleteEventArgs e) { } protected void Btn_editTicketData_Click(object sender, EventArgs e) { Button bSender = (Button)sender; ListView bSenderListview = (ListView)bSender.Parent.Parent; bSenderListview.InsertItemPosition = InsertItemPosition.LastItem; BindAccTicketAccordion(); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload