Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 克隆AJAX选项卡面板_C#_Asp.net_Ajax_Ajaxcontroltoolkit - Fatal编程技术网

C# 克隆AJAX选项卡面板

C# 克隆AJAX选项卡面板,c#,asp.net,ajax,ajaxcontroltoolkit,C#,Asp.net,Ajax,Ajaxcontroltoolkit,我在尝试克隆ajax tabcontainer控件中的模板面板时遇到了一个有趣的问题 我的想法是在第一个选项卡上有一个自定义控件,它列出了一些内容,要添加新内容,请单击自定义控件上的“新建”按钮,这将在包含tabcontainer的控件/页面中引发一个事件。然后,该控件/页面开始克隆隐藏的tabpanel并将克隆添加到tabcontainer 使用此标记,我可以从第一个选项卡(包含列表)和任何后续选项卡(由隐藏的tabpanel模板化,准备克隆)中获得所需的内容 到目前为止一切都很好。。。但是我

我在尝试克隆ajax tabcontainer控件中的模板面板时遇到了一个有趣的问题

我的想法是在第一个选项卡上有一个自定义控件,它列出了一些内容,要添加新内容,请单击自定义控件上的“新建”按钮,这将在包含tabcontainer的控件/页面中引发一个事件。然后,该控件/页面开始克隆隐藏的tabpanel并将克隆添加到tabcontainer

使用此标记,我可以从第一个选项卡(包含列表)和任何后续选项卡(由隐藏的tabpanel模板化,准备克隆)中获得所需的内容

到目前为止一切都很好。。。但是我错过了一些东西。。。我还没有模板化新的选项卡面板标题。。。看来我所能做的就是设置文本

下面这个例子:我可以做我想做的事情,但我不想写一个定义我的头模板的类,我想实例化我的标记版本的一个实例,并将该实例传递给我的新面板

我不相信这是可以做到的。。。这是一个控制错误还是我错过了什么


有什么想法吗?

我刚刚测试了以下内容,据我所知,这些内容是有效的

标记:

<asp:TabContainer ID="TabContainer1" runat="server" ViewStateMode="Enabled">
        <asp:TabPanel ID="ui_pnl1" HeaderText="My Panel" runat="server">
            <ContentTemplate>
                <asp:Button ID="btnAddPanel" runat="server" Text="Add Panel" />
            </ContentTemplate>
        </asp:TabPanel>
        <asp:TabPanel ID="TemplatePanel" runat="server" Visible ="false">
            <HeaderTemplate>
                <span>Hello World</span><asp:LinkButton ID="ui_btnRemove" runat="server" Text="X" />
            </HeaderTemplate>
            <ContentTemplate>
                <p>Test Content</p>
            </ContentTemplate>
        </asp:TabPanel>
    </asp:TabContainer>

结果证明我走错了方向

从本质上讲,分配模板和数据绑定过程是有区别的,它仍然不是完美的,因为我试图将数据传递到我的选项卡模板,但这里是基本原则

标记:

<asp:TabContainer ID="TabContainer1" runat="server">
    <asp:TabPanel ID="ui_pnl1" HeaderText="My Panel" runat="server">
        <ContentTemplate>
            <cc1:myListOfThings ID="list" runat="server" OnMyEvent="CreateTabFromTemplate" />
        </ContentTemplate>
    </asp:TabPanel>
    <asp:TabPanel ID="TemplatePanel" runat="server" Visible="false">
        <HeaderTemplate>
            <span>Hello World</span><asp:LinkButton ID="ui_btnRemove" runat="server" Text="x" />
        </HeaderTemplate>
        <ContentTemplate>
            Some content for my panel
        </ContentTemplate>
    </asp:TabPanel>
</asp:TabContainer>

这就是我正在做的。。。尝试将您的代码与我的代码结合起来,您将看到选项卡的内容包含两个模板,这是错误的。。。内容应仅包含contenttemplate代码,标题模板应定义实际选项卡本身。
<asp:TabContainer ID="TabContainer1" runat="server" ViewStateMode="Enabled">
        <asp:TabPanel ID="ui_pnl1" HeaderText="My Panel" runat="server">
            <ContentTemplate>
                <asp:Button ID="btnAddPanel" runat="server" Text="Add Panel" />
            </ContentTemplate>
        </asp:TabPanel>
        <asp:TabPanel ID="TemplatePanel" runat="server" Visible ="false">
            <HeaderTemplate>
                <span>Hello World</span><asp:LinkButton ID="ui_btnRemove" runat="server" Text="X" />
            </HeaderTemplate>
            <ContentTemplate>
                <p>Test Content</p>
            </ContentTemplate>
        </asp:TabPanel>
    </asp:TabContainer>
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.btnAddPanel.Click += new EventHandler(btnAddPanel_Click);
    }

    void btnAddPanel_Click(object sender, EventArgs e)
    {
        TabPanel newPanel = new TabPanel();

        newPanel.HeaderTemplate = TemplatePanel.HeaderTemplate;
        TemplatePanel.ContentTemplate.InstantiateIn(newPanel);

        TabContainer1.Tabs.Add(newPanel);
        TabContainer1.ActiveTab = newPanel;        
    }
}
<asp:TabContainer ID="TabContainer1" runat="server">
    <asp:TabPanel ID="ui_pnl1" HeaderText="My Panel" runat="server">
        <ContentTemplate>
            <cc1:myListOfThings ID="list" runat="server" OnMyEvent="CreateTabFromTemplate" />
        </ContentTemplate>
    </asp:TabPanel>
    <asp:TabPanel ID="TemplatePanel" runat="server" Visible="false">
        <HeaderTemplate>
            <span>Hello World</span><asp:LinkButton ID="ui_btnRemove" runat="server" Text="x" />
        </HeaderTemplate>
        <ContentTemplate>
            Some content for my panel
        </ContentTemplate>
    </asp:TabPanel>
</asp:TabContainer>
protected void CreateTabFromTemplate(object sender, EventArgs e)
{
    // create a new tab panel
    TabPanel newPanel = new TabPanel();
newPanel.HeaderTemplate = TemplatePanel.HeaderTemplate;
newPanel.ContentTemplate = TemplatePanel.ContentTemplate;
    // add the panel to the available tabs and select it
    TabContainer1.Tabs.Add(newPanel);
    TabContainer1.ActiveTab = newPanel;
}

protected void TabContainer_DataBinding(object sender, EventArgs e)
{
   foreach(TabPanel panel in TabContainer.Tabs)
   {
      //identify if this is the correct tab
      if(correctTab)
      {
          // this will find a control anywhere on the panel (eg in both header and content templates)
          Label label = panel.FindControl("ControlID") as Label;
          label.Text = "Some Business Object Value";
      }
   }
}