Originally Posted by
Daniil
Thank you, we get closer to understand.
What about the following scenario? A tab Panel can be organized as a custom control.
Example
<%@ Page Language="C#" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
[DirectMethod]
public static string GetTabContent(string parameters)
{
Dictionary<string, string> prms = JSON.Deserialize<Dictionary<string, string>>(parameters);
Ext.Net.Label label = new Ext.Net.Label(prms["tabId"] + " " + DateTime.Now.Second);
return ComponentLoader.ToConfig(label);
}
</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">
<Loader
runat="server"
Mode="Component"
DirectMethod="App.direct.GetTabContent"
ReloadOnEvent="true"
TriggerEvent="activate"
RemoveAll="true">
<Params>
<ext:Parameter Name="tabId" Value="this.id" Mode="Raw" />
</Params>
</Loader>
</ext:Panel>
<ext:Panel ID="Panel2" runat="server" Title="Tab 2">
<Loader
runat="server"
Mode="Component"
DirectMethod="App.direct.GetTabContent"
ReloadOnEvent="true"
TriggerEvent="activate"
RemoveAll="true">
<Params>
<ext:Parameter Name="tabId" Value="this.id" Mode="Raw" />
</Params>
</Loader>
</ext:Panel>
<ext:Panel ID="Panel3" runat="server" Title="Tab 3">
<Loader
runat="server"
Mode="Component"
DirectMethod="App.direct.GetTabContent"
ReloadOnEvent="true"
TriggerEvent="activate"
RemoveAll="true">
<Params>
<ext:Parameter Name="tabId" Value="this.id" Mode="Raw" />
</Params>
</Loader>
</ext:Panel>
</Items>
<Listeners>
<BeforeTabChange Handler="oldTab.removeAll();" />
</Listeners>
</ext:TabPanel>
</form>
</body>
</html>
In your solution is a problem with static keyword of directMethod. I need to operate inside of this directMethod on public nonstatic properties as well as nonstatic methods which is unable with your sample @Daniil.
And after make your sample to fit my needs I've get nullreference exception of control which I want to load via loader, because there is not perform OnInit control event so all controls inside of control I want to load are null.
here is sample to reproduce:
<%@ 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};
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 override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
btnCreate.Hidden = false;
}
}
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);
//tPanel.ActiveTab = 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>