2

I want my ajaxToolkit:TabContainer to have a tabpanel that allows the user to add another tab. I only want it to postback when they have clicked the "+" tabpanel and no other. I can't seem to stop the event bubbling in the Javascript:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script type="text/javascript">
    function checkTab(sender, e) {
        if (sender.get_activeTab().get_headerText().replace("<span>", "").replace("</span>", "") != "+") {
            cancelBubble(e);

        }
        else {
            if (!confirm('Are you sure?')) {
                cancelBubble(e);
            }
        }
    }
    function cancelBubble(e) {
        if (e) {
            e.stopPropagation();
        }
        else {
            window.event.cancelBubble = true;
        }
    }
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:ScriptManager ID="ScriptManager" runat="server">
</asp:ScriptManager>
  <ajaxToolkit:TabContainer ID="MyTabContainer" runat="server" OnActiveTabChanged="MyTabContainer_OnActiveTabChanged"
        AutoPostBack="true" OnClientActiveTabChanged="checkTab">
        <ajaxToolkit:TabPanel ID="TabPanel1" runat="server" HeaderText="My First Tab" Enabled="true">
            <ContentTemplate>
                My first tab
            </ContentTemplate>
        </ajaxToolkit:TabPanel>
        <ajaxToolkit:TabPanel ID="AddTabPanel" runat="server" HeaderText="+" Enabled="true">
            <ContentTemplate>
            </ContentTemplate>
        </ajaxToolkit:TabPanel>
    </ajaxToolkit:TabContainer>
</div>
</form>
</body>
</html>


 protected void MyTabContainer_OnActiveTabChanged(object sender, EventArgs e)
    {
        TabPanel tp = new TabPanel();
        tp.HeaderText = "New Tab";
        MyTabContainer.Tabs.Add(tp);
    }

Thanks, Alex

Alex Driver
  • 73
  • 1
  • 5

3 Answers3

1

You can use return false; in JavaScript to stop a PostBack. So I think all you need is this:

function checkTab(sender, e) 
{
    if (sender.get_activeTab().get_headerText().replace("<span>", "").replace("</span>", "") != "+") 
    {
        return false;
    }
    else 
    {
       return confirm('Are you sure?');
    }
}
Josh Darnell
  • 11,304
  • 9
  • 38
  • 66
  • No good, it still goes through to postback as it won't let me do: OnClientActiveTabChanged="return checkTab" – Alex Driver Apr 17 '13 at 13:30
  • @AlexDriver I haven't worked with the AJAX Control Toolkit controls in a while, but did you try `OnClientActiveTabChanged="return checkTab(this);"` or just `OnClientActiveTabChanged="return checkTab();"`? – Josh Darnell Apr 17 '13 at 13:33
  • SyntaxError: syntax error ...pPlacement":false}, {"activeTabChanged":return checkTab(this);}, null – Alex Driver Apr 17 '13 at 13:41
  • @AlexDriver I find it odd that just `OnClientActiveTabChanged="checkTab"` doesn't do the trick with the code above. Sorry, I really thought that would work. – Josh Darnell Apr 17 '13 at 14:16
  • @AlexDriver Have you tried attaching the event to the `OnClientClick` event of the actual "+" tab asnd processing that way (realizing that you would have to tweak your logic a little)? – Josh Darnell Apr 17 '13 at 14:17
0

Add script below to your project and add reference on at at very bottom of page:

Sys.Extended.UI.TabPanel.prototype.raiseClick = function (eventArgs) {
    var eh = this.get_events().getHandler("click");
    if (eh) {
        eh(this, eventArgs);
    }
};

Sys.Extended.UI.TabPanel.prototype._header_onclick = function (e) {
    e.preventDefault();
    var eventArgs = new Sys.CancelEventArgs();
    this.raiseClick(eventArgs);

    if (eventArgs.get_cancel() === true)
        return;

    this.get_owner().set_activeTab(this);
    this._setFocus(this);
};

Now we add capability to cancel click on particular tab on client. The sample of usage:

 <script type="text/javascript">
      function AddTabOnClientClick(sender, args) {
           args.set_cancel(!confirm("Are you sure?"));
      }
 </script>

 <form id="form1" runat="server">
 <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
 </ajaxToolkit:ToolkitScriptManager>
 <div>
      <asp:UpdatePanel runat="server">
           <ContentTemplate>
                <ajaxToolkit:TabContainer ID="MyTabContainer" runat="server" AutoPostBack="true"
                     ActiveTabIndex="0">
                     <ajaxToolkit:TabPanel ID="TabPanel1" runat="server" HeaderText="My First Tab" Enabled="true">
                          <ContentTemplate>
                               My first tab
                          </ContentTemplate>
                     </ajaxToolkit:TabPanel>
                     <ajaxToolkit:TabPanel ID="AddTabPanel" runat="server" HeaderText="+" OnClientClick="AddTabOnClientClick">
                          <ContentTemplate>
                          </ContentTemplate>
                     </ajaxToolkit:TabPanel>
                </ajaxToolkit:TabContainer>
           </ContentTemplate>
      </asp:UpdatePanel>
 </div>
 </form>
 <script src="Scripts/MyAjaxToolkitExtensions.js" type="text/javascript"></script>
Yuriy Rozhovetskiy
  • 22,270
  • 4
  • 37
  • 68
0

Thanks to jadarnel27, this is the final solution I went for:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script type="text/javascript">
<script type="text/javascript">
    function addTab() {

        if (confirm('Are you sure?')) {
            document.getElementById('<%=AddTabButton.ClientID %>').click();
        }
    }
</script>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager" runat="server">
</asp:ScriptManager>
 <asp:Button ID = "AddTabButton" runat="server" OnClick="AddTabButton_OnClick" CssClass="DisplayNone" />
  <ajaxToolkit:TabContainer ID="MyTabContainer" runat="server">
    <ajaxToolkit:TabPanel ID="TabPanel1" runat="server" HeaderText="My First Tab" Enabled="true">
        <ContentTemplate>
            My first tab
        </ContentTemplate>
    </ajaxToolkit:TabPanel>
    <ajaxToolkit:TabPanel ID="AddTabPanel" runat="server" HeaderText="+" Enabled="true" OnClientClick="addTab">
        <ContentTemplate>
        </ContentTemplate>
    </ajaxToolkit:TabPanel>
</ajaxToolkit:TabContainer>
</div>
</form>
</body>
</html>


protected void AddTabButton_OnClick(object sender, EventArgs e)
    {
       TabPanel tp = new TabPanel();
    tp.HeaderText = "New Tab";
    MyTabContainer.Tabs.Add(tp);
    }
Alex Driver
  • 73
  • 1
  • 5