Hi folks,
I may be doing something stupid here, but I've spent the morning grinding my teeth long enough that I've decided to ask someone else to point out my error :)
I have a RadNotification, in a RadAjaxPanel:
<telerik:RadAjaxPanel ID="notificationPanel" runat="server" ViewStateMode="Enabled"> <telerik:RadNotification ID="RadNotification1" KeepOnMouseOver="true" runat="server" VisibleOnPageLoad="false" ContentScrolling="Auto" Width="400" Height="300" TitleIcon="none" ContentIcon="none" Animation="Fade" EnableRoundedCorners="true" EnableShadow="true" Title="Notification Title" ShowCloseButton="true" Pinned="true" Opacity="80" AutoCloseDelay="3000" Position="TopRight" OffsetX="-50" OffsetY="50" VisibleTitlebar="true" style="z-index: 35000;"> <ContentTemplate> <asp:Table ID="shoppingCartTable" runat="server" Width="380" ViewStateMode="Enabled"> </asp:Table> <asp:Button ID="checkoutButton" runat="server" Text="Convert" OnClick="btnCheckout_Click" /> </ContentTemplate> </telerik:RadNotification></telerik:RadAjaxPanel>A method (in another RadAjaxPanel) creates controls inside "shoppingCartTable" in the contenttemplate of the RadNotification.
The method which fills the table is:
private void FillCartTable() { RadNotification1.Title = "Purchase order cart"; if (Session["PurchaseOrderCart"] == null) { Session["PurchaseOrderCart"] = new Dictionary<long, Dictionary<long, PurchaseOrderLine>>(); } Dictionary<long, Dictionary<long, PurchaseOrderLine>> cart = (Dictionary<long, Dictionary<long, PurchaseOrderLine>>)Session["PurchaseOrderCart"]; foreach (long tenderID in cart.Keys) { TableHeaderRow th = new TableHeaderRow(); TableHeaderCell thc = new TableHeaderCell(); thc.ColumnSpan = 4; thc.Text = Tender.GetTender(tenderID).Supplier.Name; th.Cells.Add(thc); shoppingCartTable.Rows.Add(th); foreach (long TenderLineID in cart[tenderID].Keys) { PurchaseOrderLine pol = cart[tenderID][TenderLineID]; TableRow tr = new TableRow(); TableCell tc1 = new TableCell(); tc1.Text = " "; tr.Cells.Add(tc1); TableCell tc2 = new TableCell(); tc2.Text = pol.StockOrServiceDescription; tr.Cells.Add(tc2); TableCell tc3 = new TableCell(); tc3.Text = pol.QuantityOrdered + " " + pol.QuantityBase.Description + " at " + pol.Price.ToString("C", Global.currencyFormat) + " per " + pol.PricingBase.Description; tr.Cells.Add(tc3); TableCell tc4 = new TableCell(); Image b = new Image(); b.ImageUrl = "~/images/icons/16/delete.png"; tc4.Controls.Add(b); CheckBox c = new CheckBox(); c.ID = "removeFromCart_" + tenderID.ToString() + ":" + TenderLineID.ToString(); c.EnableViewState = true; c.ClientIDMode = System.Web.UI.ClientIDMode.Static; tc4.Controls.Add(c); tr.Cells.Add(tc4); shoppingCartTable.Rows.Add(tr); //sb.Append("<tr><td> </td><td>" + pol.Stock.Product.Number + " (" + pol.Stock.SizeDescription + ")" + "</td><td>" + pol.QuantityOrdered + " " + pol.QuantityBase.Description + "</td></tr>"); } } //sb.Append("</table>"); //sb.Append("<asp:Button ID='btnCheckout' runat='server' Text='Convert' OnClick='btnCheckout_Click' />"); //RadNotification1.Text = sb.ToString(); }
Showing the notification works just fine, and my content is there. That method is called in Page_Init, so each time the controls are created very early in the page lifecycle, long before any ViewState related events, and they're created with the same IDs (and same uniqueIDs) each time the page loads.
When the onclick event fires for the notificationcontrol's button, the checkboxes are all unchecked. They do exist (see the attached image) and the IDs do match the ones in viewstate. However, they're never re-populated from viewstate.... the attached image is a snapshot taken at the end of Page_Init and shows what I'd expect (Checked is false). However, it's still false after all the viewstate events, at the end of Page_Load - despite the Form values collection quite clearly containing that control's state.
I have temporarily worked around it by manually populating them in Page_Init (by traversing the Form values collection, looking for any with an ID containing "removeFromCart" and then manually assigning the checked property). But surely this isn't the right way to be doing it? Why doesn't Viewstate automatically get set on these controls, given that the ID and UniqueID properties are identical before and after a postback?
Cheers!


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RadEditor.aspx.cs" Inherits="Testing_RadEditor" %><%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <div> <telerik:RadScriptManager ID="RadScriptMAnager1" runat="server"></telerik:RadScriptManager> <telerik:RadEditor ID="RadEditor1" runat="server" Skin="Outlook"> <Tools> <telerik:EditorToolGroup Tag="MainToolbar"> <telerik:EditorTool Name="Print" ShortCut="CTRL+P" /> <telerik:EditorTool Name="AjaxSpellCheck" /> <telerik:EditorTool Name="FindAndReplace" ShortCut="CTRL+F" /> <telerik:EditorTool Name="SelectAll" ShortCut="CTRL+A" /> <telerik:EditorTool Name="Cut" /> <telerik:EditorTool Name="Copy" ShortCut="CTRL+C" /> <telerik:EditorTool Name="Paste" ShortCut="CTRL+V" /> <telerik:EditorToolStrip Name="PasteStrip"> </telerik:EditorToolStrip> <telerik:EditorSeparator /> <telerik:EditorSplitButton Name="Undo"> </telerik:EditorSplitButton> <telerik:EditorSplitButton Name="Redo"> </telerik:EditorSplitButton> </telerik:EditorToolGroup> <telerik:EditorToolGroup Tag="InsertToolbar"> <telerik:EditorTool Name="ImageManager" ShortCut="CTRL+G" /> <telerik:EditorTool Name="DocumentManager" /> <telerik:EditorTool Name="FlashManager" /> <telerik:EditorTool Name="MediaManager" /> <telerik:EditorTool Name="TemplateManager" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="LinkManager" ShortCut="CTRL+K" /> <telerik:EditorTool Name="Unlink" ShortCut="CTRL+SHIFT+K" /> </telerik:EditorToolGroup> <telerik:EditorToolGroup> <telerik:EditorTool Name="Superscript" /> <telerik:EditorTool Name="Subscript" /> <telerik:EditorTool Name="InsertParagraph" /> <telerik:EditorTool Name="InsertGroupbox" /> <telerik:EditorTool Name="InsertHorizontalRule" /> <telerik:EditorTool Name="InsertDate" /> <telerik:EditorTool Name="InsertTime" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="FormatCodeBlock" /> </telerik:EditorToolGroup> <telerik:EditorToolGroup> <telerik:EditorDropDown Name="FormatBlock"> </telerik:EditorDropDown> <telerik:EditorDropDown Name="FontName"> </telerik:EditorDropDown> <telerik:EditorDropDown Name="RealFontSize"> </telerik:EditorDropDown> </telerik:EditorToolGroup> <telerik:EditorToolGroup> <telerik:EditorTool Name="AbsolutePosition" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="Bold" ShortCut="CTRL+B" /> <telerik:EditorTool Name="Italic" ShortCut="CTRL+I" /> <telerik:EditorTool Name="Underline" ShortCut="CTRL+U" /> <telerik:EditorTool Name="StrikeThrough" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="JustifyLeft" /> <telerik:EditorTool Name="JustifyCenter" /> <telerik:EditorTool Name="JustifyRight" /> <telerik:EditorTool Name="JustifyFull" /> <telerik:EditorTool Name="JustifyNone" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="Indent" /> <telerik:EditorTool Name="Outdent" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="InsertOrderedList" /> <telerik:EditorTool Name="InsertUnorderedList" /> <telerik:EditorSeparator /> <telerik:EditorTool Name="ToggleTableBorder" /> <telerik:EditorTool Name="XhtmlValidator" /> </telerik:EditorToolGroup> <telerik:EditorToolGroup> <telerik:EditorSplitButton Name="ForeColor"> </telerik:EditorSplitButton> <telerik:EditorSplitButton Name="BackColor"> </telerik:EditorSplitButton> <telerik:EditorDropDown Name="ApplyClass"> </telerik:EditorDropDown> <telerik:EditorToolStrip Name="FormatStripper"> </telerik:EditorToolStrip> </telerik:EditorToolGroup> <telerik:EditorToolGroup Tag="DropdownToolbar"> <telerik:EditorSplitButton Name="InsertSymbol"> </telerik:EditorSplitButton> <telerik:EditorToolStrip Name="InsertTable"> </telerik:EditorToolStrip> <telerik:EditorToolStrip Name="InsertFormElement"> </telerik:EditorToolStrip> <telerik:EditorSplitButton Name="InsertSnippet"> </telerik:EditorSplitButton> <telerik:EditorTool Name="ImageMapDialog" /> <telerik:EditorDropDown Name="InsertCustomLink"> </telerik:EditorDropDown> <telerik:EditorSeparator /> <telerik:EditorTool Name="ConvertToLower" /> <telerik:EditorTool Name="ConvertToUpper" /> <telerik:EditorSeparator /> <telerik:EditorDropDown Name="Zoom"> </telerik:EditorDropDown> <telerik:EditorSplitButton Name="ModuleManager"> </telerik:EditorSplitButton> <telerik:EditorTool Name="ToggleScreenMode" ShortCut="F11" /> <telerik:EditorTool Name="AboutDialog" /> </telerik:EditorToolGroup> </Tools> <Content></Content> </telerik:RadEditor> </div> </form></body></html>