Hello,
In my webpage I try to add a user control into RadPanelBar during ItemDataBound event. The user control showed up correctly after the 1st page load, but if user do post back the adding control is disappeared. I figured it could be related to viewstate mismatch, so I try give control a unique ID but problem still persist.
Any help is very appreciated!
Here is my test page code: http://209.200.250.235/Dynamic_panelbar_test.zip
Thanks.
(test.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="test" %> | |
<%@ 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" style="height: 100%; width: 100%; margin: 0px; | |
padding: 0px; overflow: hidden;"> | |
<head runat="server"> | |
<title></title> | |
</head> | |
<body style="height: 100%; width: 100%; margin: 0px; padding: 0px; overflow: hidden;"> | |
<form runat="server"> | |
<telerik:RadScriptManager ID="uxRadScriptManager" runat="server"> | |
</telerik:RadScriptManager> | |
<telerik:RadAjaxManager ID="uxRadAjaxManager" runat="server"> | |
</telerik:RadAjaxManager> | |
<telerik:RadPanelBar ID="uxRadMenuBarML" runat="server" BorderStyle="None" BorderWidth="0px" Height="372px" | |
PersistStateInCookie="True" Width="400px" OnItemDataBound="uxRadMenuBarML_ItemDataBound" | |
OnItemClick="uxRadMenuBarML_ItemClick" Style="" Skin="Office2007" EnableEmbeddedSkins="true"> | |
</telerik:RadPanelBar> | |
</form> | |
</body> | |
</html> | |
(test.aspx.cs)
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Web; | |
using System.Web.UI; | |
using System.Web.UI.WebControls; | |
using Telerik.Web.UI; | |
using System.Globalization; | |
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "test")] | |
public partial class test : System.Web.UI.Page | |
{ | |
private List<LFMenuBarDataItem> _menuBarDataItem; | |
protected void Page_Load(object sender, EventArgs e) | |
{ | |
//enable AJAX update on PanelBar | |
RadAjaxManager.GetCurrent(Page).AjaxSettings.AddAjaxSetting(this.uxRadMenuBarML, this.uxRadMenuBarML); | |
} | |
protected override void OnInit(EventArgs e) | |
{ | |
base.OnInit(e); | |
_menuBarDataItem = new List<LFMenuBarDataItem>(); | |
//----------- | |
AddMenuBarItem(0, "Search", "~/UCSearch.ascx"); | |
AddMenuBarItem(1, null, "Home", "", "", false, false); | |
AddMenuBarItem(2, null, "My Inbox", "", "", false, false); | |
AddMenuBarItem(3, 1, "dummy item 1", "", "", false, false); | |
AddMenuBarItem(4, 2, "dummy item 2", "", "", false, false); | |
//----------- | |
uxRadMenuBarML.DataTextField = "Title"; | |
uxRadMenuBarML.DataFieldID = "ID"; | |
uxRadMenuBarML.DataFieldParentID = "ParentID"; | |
uxRadMenuBarML.DataSource = _menuBarDataItem; | |
uxRadMenuBarML.DataBind(); | |
} | |
/// <summary> | |
/// Adds the menu bar item. (used by presenter to set menu items) | |
/// </summary> | |
/// <param name="id">The id.</param> | |
/// <param name="parentId">The parent id.</param> | |
/// <param name="title">The title.</param> | |
/// <param name="userControlPath">The user control path.</param> | |
/// <param name="imagePath">The left side image path.</param> | |
/// <param name="isPinDisplayed">if set to <c>true</c> [current pin is displayed].</param> | |
/// <param name="isMenuExpanded">if set to <c>true</c> [current menu is expanded].</param> | |
public void AddMenuBarItem(int id, int? parentId, string title, string userControlPath, string imagePath, bool isPinDisplayed, bool isMenuExpanded) | |
{ | |
LFMenuBarDataItem menuBarDataItem = new LFMenuBarDataItem | |
{ | |
Id = id, | |
ParentId = parentId, | |
Title = title, | |
PagePath = userControlPath, | |
ImagePath = imagePath, | |
IsPinDisplayed = isPinDisplayed, | |
IsMenuExpanded = isMenuExpanded, | |
IsNestedUserControl = false | |
}; | |
_menuBarDataItem.Add(menuBarDataItem); | |
} | |
/// <summary> | |
/// Adds the menu bar item. (used by presenter to set menu items) | |
/// -this overload is used to install nested user control menu item | |
/// </summary> | |
/// <param name="id">The id.</param> | |
/// <param name="nestUserControlPath">The nest user control path.</param> | |
public void AddMenuBarItem(int id, string title, string nestUserControlPath) | |
{ | |
LFMenuBarDataItem menuBarDataItem = new LFMenuBarDataItem | |
{ | |
Id = id, | |
Title = title, | |
NestedUserControlPath = nestUserControlPath, | |
IsNestedUserControl = true | |
}; | |
_menuBarDataItem.Add(menuBarDataItem); | |
} | |
/// <summary> | |
/// Handles the ItemClick event of the uxRadMenuBarML control. | |
/// </summary> | |
/// <param name="sender">The source of the event.</param> | |
/// <param name="e">The <see cref="Telerik.Web.UI.RadPanelBarEventArgs"/> instance containing the event data.</param> | |
protected void uxRadMenuBarML_ItemClick(object sender, RadPanelBarEventArgs e) | |
{ | |
} | |
/// <summary> | |
/// Handles the ItemDataBound event of the uxRadMenuBarML control. | |
/// </summary> | |
/// <param name="sender">The source of the event.</param> | |
/// <param name="e">The <see cref="Telerik.Web.UI.RadPanelBarEventArgs"/> instance containing the event data.</param> | |
protected void uxRadMenuBarML_ItemDataBound(object sender, RadPanelBarEventArgs e) | |
{ | |
LFMenuBarDataItem item = (LFMenuBarDataItem)e.Item.DataItem; | |
if (item.IsNestedUserControl) // nested user control | |
{ | |
//Control ctl = Page.LoadControl(item.NestedUserControlPath); // load user control | |
Button ctl = new Button(); // here we create a dummy button control for test | |
ctl.Text = "I am a test button. Click me and I should not disappear"; | |
ctl.ID = "TestButton" + Guid.NewGuid().ToString(); | |
RadPanelItem radPanelItem = new RadPanelItem(); | |
radPanelItem.Controls.Add(ctl); | |
e.Item.Items.Clear(); | |
e.Item.Items.Add(radPanelItem); | |
} | |
else // normal menubar item | |
{ | |
e.Item.ImageUrl = item.ImagePath; | |
} | |
e.Item.Value = item.Id.ToString(CultureInfo.InvariantCulture); | |
e.Item.Expanded = item.IsMenuExpanded; | |
} | |
/// <summary> | |
/// Data class stores menu bar data item | |
/// </summary> | |
internal class LFMenuBarDataItem | |
{ | |
public bool IsNestedUserControl | |
{ | |
get; | |
set; | |
} | |
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |
public bool IsPinDisplayed | |
{ | |
get; | |
set; | |
} | |
public bool IsMenuExpanded | |
{ | |
get; | |
set; | |
} | |
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |
public string Title | |
{ | |
get; | |
set; | |
} | |
public int Id | |
{ | |
get; | |
set; | |
} | |
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |
public int? ParentId | |
{ | |
get; | |
set; | |
} | |
public string ImagePath | |
{ | |
get; | |
set; | |
} | |
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |
public string PagePath | |
{ | |
get; | |
set; | |
} | |
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |
public string NestedUserControlPath | |
{ | |
get; | |
set; | |
} | |
} | |
} | |
(test.aspx.designer.cs)
//------------------------------------------------------------------------------ | |
// <auto-generated> | |
// This code was generated by a tool. | |
// Runtime Version:2.0.50727.3053 | |
// | |
// Changes to this file may cause incorrect behavior and will be lost if | |
// the code is regenerated. | |
// </auto-generated> | |
//------------------------------------------------------------------------------ | |
public partial class test { | |
/// <summary> | |
/// uxRadScriptManager control. | |
/// </summary> | |
/// <remarks> | |
/// Auto-generated field. | |
/// To modify move field declaration from designer file to code-behind file. | |
/// </remarks> | |
protected global::Telerik.Web.UI.RadScriptManager uxRadScriptManager; | |
/// <summary> | |
/// uxRadAjaxManager control. | |
/// </summary> | |
/// <remarks> | |
/// Auto-generated field. | |
/// To modify move field declaration from designer file to code-behind file. | |
/// </remarks> | |
protected global::Telerik.Web.UI.RadAjaxManager uxRadAjaxManager; | |
/// <summary> | |
/// uxRadMenuBarML control. | |
/// </summary> | |
/// <remarks> | |
/// Auto-generated field. | |
/// To modify move field declaration from designer file to code-behind file. | |
/// </remarks> | |
protected global::Telerik.Web.UI.RadPanelBar uxRadMenuBarML; | |
} | |