May 24, 2013, 3:45 AM
The fix has been committed to SVN. Now the OnInit of your control should be executed first.
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="Ext.NetTest2.x" %>
<%@ Register TagPrefix="ext" Namespace="Ext.Net" Assembly="Ext.Net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public class ControlVBox1 : Ext.Net.Container
{
private Ext.Net.Panel cntButtons;
private Ext.Net.Panel mainContainer;
private Ext.Net.Button btnCreate;
private Ext.Net.Button btnSearch;
private Ext.Net.GridPanel gridPanelMain;
private Ext.Net.GridView gridView;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.LayoutConfig.Add(new VBoxLayoutConfig {Align = VBoxAlign.Stretch});
btnCreate = new Ext.Net.Button {ID = this.ID + "_create", Text = "Create", Height = 26, Width = 70};
btnSearch = new Ext.Net.Button {ID = this.ID + "_search", Text = "Search", Height = 26, Width = 70};
btnSearch.DirectClick += new ComponentDirectEvent.DirectEventHandler(btnSearch_DirectClick);
cntButtons = new Ext.Net.Panel {ID = this.ID + "_buttons"};
cntButtons.LayoutConfig.Add(new HBoxLayoutConfig {Align = HBoxAlign.Stretch});
cntButtons.Items.Add(btnCreate);
cntButtons.Items.Add(btnSearch);
this.Items.Add(cntButtons);
gridPanelMain = new GridPanel {ID = this.ID + "_gridPanel", Layout = LayoutType.Fit.ToString()};
gridView = new Ext.Net.GridView {ID = this.ID + "_gridView"};
gridPanelMain.View.Add(gridView);
mainContainer = new Ext.Net.Panel {ID = this.ID + "_main", Flex = 1, Layout = LayoutType.Fit.ToString()};
mainContainer.Items.Add(gridPanelMain);
this.Items.Add(mainContainer);
}
protected void btnSearch_DirectClick(object sender, DirectEventArgs e)
{
//do something
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
btnCreate.Hidden = false;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
btnCreate.Hidden = true;
}
}
public string PreviousTabLoaded
{
get { return Session["PreviousTabLoaded"] == null ? string.Empty : (string) Session["PreviousTabLoaded"]; }
set { Session["PreviousTabLoaded"] = value; }
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
int count = 6;
Ext.Net.Panel panel;
while (count != 0)
{
panel = new Ext.Net.Panel{ID="panel"+count,Title = "Tab"+count,Layout = LayoutType.Fit.ToString()};
panel.Loader = new ComponentLoader { ID = panel.ID + "_loader", Mode = LoadMode.Component, RemoveAll = true, ReloadOnEvent = true, TriggerEvent = "activate", DirectMethod = "#{DirectMethods}.GetTabContent",Params = {new Ext.Net.Parameter("tabId","this.id",ParameterMode.Raw)}};
if (string.IsNullOrEmpty(PreviousTabLoaded))
{
PreviousTabLoaded = panel.ID;
tPanel.Items.Add(panel);
}
else if (PreviousTabLoaded.Contains(panel.ID))
{
tPanel.Items.Add(panel);
}
else
{
tPanel.Items.Add(panel);
}
count--;
}
}
[DirectMethod]
public string GetTabContent(string parameters)
{
Dictionary<string, string> prms = JSON.Deserialize<Dictionary<string, string>>(parameters);
ControlVBox1 control = new ControlVBox1 { ID = prms["tabId"] + "_control" };
Ext.Net.X.Mask.Hide();
return ComponentLoader.ToConfig(control);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<ext:ResourceManager runat="server" IDMode="Legacy" ScriptMode="Development"></ext:ResourceManager>
<ext:Viewport runat="server">
<LayoutConfig>
<ext:FitLayoutConfig runat="server"/>
</LayoutConfig>
<Items>
<ext:Container runat="server" ID="mainContainer">
<LayoutConfig>
<ext:VBoxLayoutConfig runat="server" Align="Stretch"/>
</LayoutConfig>
<Items>
<ext:Panel runat="server" ID="buttons" Height="30">
<Items>
<ext:Hidden runat="server" ID="tabId"></ext:Hidden>
<ext:Button runat="server" ID="button" Text="button"></ext:Button>
</Items>
</ext:Panel>
<ext:Panel runat="server" ID="mainCont" Flex="1" Layout="FitLayout">
<Items>
<ext:TextField runat="server"></ext:TextField>
<ext:TextField runat="server"></ext:TextField>
</Items>
</ext:Panel>
<ext:Panel runat="server" Title="List" ID="southPanel" MinHeight="200" MaxHeight="300" Flex="1" Collapsible="True" CollapseMode="Default" Collapsed="True" >
<Items>
<ext:TabPanel ID="tPanel" AutoHeight="True" runat="server" Border="false" ActiveIndex="0" Layout="FitLayout" >
<Listeners>
<BeforeTabChange Handler="oldTab.removeAll();" />
<TabChange Handler="Ext.net.Mask.show({ msg : 'Trwa ładowanie listy...', el : newTab });"></TabChange>
</Listeners>
</ext:TabPanel>
</Items>
</ext:Panel>
</Items>
</ext:Container>
</Items>
</ext:Viewport>
</body>
</html>
test steps:<%@ Page Language="C#" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
private Ext.Net.Button CreateButton(string tabId)
{
Ext.Net.Button button = new Ext.Net.Button();
button.ID = tabId + "_button";
button.Text = "I am " + tabId + "_button";
button.DirectClick += Button_Click;
return button;
}
protected void Page_Load(object sender, EventArgs e)
{
// populating initially active tab
if (!X.IsAjaxRequest)
{
this.Panel1.Items.Add(this.CreateButton("Panel1"));
this.Session["ButtonTabIdToRecreate"] = "Panel1";
}
// recreating a control within a current tab to get its DirectEvent working
if (X.IsAjaxRequest)
{
string tabId = this.Session["ButtonTabIdToRecreate"].ToString();
Ext.Net.Panel currentTab = this.FindControl(tabId) as Ext.Net.Panel;
currentTab.Items.Add(this.CreateButton(tabId));
}
}
protected void TabChange(object sender, DirectEventArgs e)
{
Ext.Net.Panel oldTab = this.FindControl(e.ExtraParams["oldTabId"]) as Ext.Net.Panel;
oldTab.RemoveAll();
Ext.Net.Panel newTab = this.FindControl(e.ExtraParams["newTabId"]) as Ext.Net.Panel;
this.Session["ButtonTabIdToRecreate"] = newTab.ID;
this.CreateButton(newTab.ID).AddTo(newTab);
}
protected void Button_Click(object sender, DirectEventArgs e)
{
X.Msg.Alert("Button_Click", (sender as Ext.Net.Button).ID).Show();
}
</script>
<!DOCTYPE html>
<html>
<head runat="server">
<title>Ext.NET v2 Example</title>
</head>
<body>
<form runat="server">
<ext:ResourceManager runat="server" />
<ext:TabPanel runat="server">
<Items>
<ext:Panel ID="Panel1" runat="server" Title="Tab 1" />
<ext:Panel ID="Panel2" runat="server" Title="Tab 2" />
<ext:Panel ID="Panel3" runat="server" Title="Tab 3" />
</Items>
<DirectEvents>
<TabChange OnEvent="TabChange">
<ExtraParams>
<ext:Parameter Name="oldTabId" Value="oldTab.id" Mode="Raw" />
<ext:Parameter Name="newTabId" Value="newTab.id" Mode="Raw" />
</ExtraParams>
</TabChange>
</DirectEvents>
</ext:TabPanel>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
public class ControlVBox1 : Ext.Net.Container
{
private Ext.Net.Panel cntButtons;
private Ext.Net.Panel mainContainer;
private Ext.Net.Button btnCreate;
private Ext.Net.Button btnSearch;
private Ext.Net.GridPanel gridPanelMain;
private Ext.Net.GridView gridView;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.LayoutConfig.Add(new VBoxLayoutConfig { Align = VBoxAlign.Stretch });
btnCreate = new Ext.Net.Button { ID = this.ID + "_create", Text = "Create", Height = 26, Width = 70 };
btnSearch = new Ext.Net.Button { ID = this.ID + "_search", Text = "Search", Height = 26, Width = 70 };
btnSearch.DirectClick += new ComponentDirectEvent.DirectEventHandler(btnSearch_DirectClick);
cntButtons = new Ext.Net.Panel { ID = this.ID + "_buttons" };
cntButtons.LayoutConfig.Add(new HBoxLayoutConfig { Align = HBoxAlign.Stretch });
cntButtons.Items.Add(btnCreate);
cntButtons.Items.Add(new DisplayField { ID = this.ID + "_display", Flex = 1, Html = " " });
FieldContainer fieldContainer = new FieldContainer { ID = this.ID + "_fieldContainer", Flex = 1, StyleSpec = "text-align: right;" };
fieldContainer.Items.Add(btnSearch);
cntButtons.Items.Add(fieldContainer);
this.Items.Add(cntButtons);
gridPanelMain = new GridPanel { ID = this.ID + "_gridPanel", Layout = LayoutType.Fit.ToString() };
gridView = new Ext.Net.GridView { ID = this.ID + "_gridView" };
gridPanelMain.View.Add(gridView);
mainContainer = new Ext.Net.Panel { ID = this.ID + "_main", Flex = 1, Layout = LayoutType.Fit.ToString() };
mainContainer.Items.Add(gridPanelMain);
this.Items.Add(mainContainer);
}
protected void btnSearch_DirectClick(object sender, DirectEventArgs e)
{
Ext.Net.X.Msg.Alert("alert","alert").Show();
//do something
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
btnCreate.Hidden = false;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
btnCreate.Hidden = true;
}
}
public string PreviousTabLoaded
{
get { return Session["PreviousTabLoaded"] == null ? string.Empty : (string)Session["PreviousTabLoaded"]; }
set { Session["PreviousTabLoaded"] = value; }
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
int count = 6;
Ext.Net.Panel panel;
while (count != 0)
{
panel = new Ext.Net.Panel { ID = "panel" + count, Title = "Tab" + count, Layout = LayoutType.Fit.ToString() };
if (string.IsNullOrEmpty(PreviousTabLoaded))
{
PreviousTabLoaded = panel.ID;
}
if (PreviousTabLoaded.Contains(panel.ID))
{
ControlVBox1 control = new ControlVBox1 { ID = panel.ID + "_control" };
panel.Items.Add(control);
TabPanel1.Items.Add(panel);
}
else
{
TabPanel1.Items.Add(panel);
}
count--;
}
}
protected void TabChange(object sender, DirectEventArgs e)
{
Ext.Net.Panel oldTab = TabPanel1.Items.FirstOrDefault(x => x.ClientID == "App." +e.ExtraParams["oldTabId"]) as Ext.Net.Panel;
oldTab.RemoveAll();
Ext.Net.Panel newTab = TabPanel1.Items.FirstOrDefault(x => x.ClientID == "App." +e.ExtraParams["newTabId"]) as Ext.Net.Panel;
PreviousTabLoaded = newTab.ID;
ControlVBox1 control = new ControlVBox1(){ID=newTab.ID+"control"};
control.AddTo(newTab);
}
</script>
<!DOCTYPE html>
<html>
<head id="Head1" runat="server">
<title>Ext.NET v2 Example</title>
</head>
<body>
<form id="Form1" runat="server">
<ext:ResourceManager ID="ResourceManager1" runat="server" IDMode="Legacy"/>
<ext:TabPanel ID="TabPanel1" runat="server">
<DirectEvents>
<TabChange OnEvent="TabChange">
<ExtraParams>
<ext:Parameter Name="oldTabId" Value="oldTab.id" Mode="Raw" />
<ext:Parameter Name="newTabId" Value="newTab.id" Mode="Raw" />
</ExtraParams>
</TabChange>
</DirectEvents>
</ext:TabPanel>
</form>
</body>
</html>
steps to reproduce:if (PreviousTabLoaded.Contains(panel.ID) && !(this.Request["__EVENTARGUMENT"] != null && this.Request["__EVENTARGUMENT"].Equals("TabPanel1|event|TabChange")))
{
ControlVBox1 control = new ControlVBox1 { ID = panel.ID + "_control" };
panel.Items.Add(control);
TabPanel1.Items.Add(panel);
}