I have a Ajax TabContainer that has 3 tabs and each of the tab contains a formview to display/update data. When the user modifies any data in the edit mode in the formview and tries to change tab without updating the data, i would like to display a warning message to alert the user that he/she has some unsaved data in the form and abort the tab change. I sort of have an idea how to do it but somehow it's giving me a runtime javascript object reference = null runtime error on sender.set_activeTabIndex(0); in tabChanged(). Can someone help please? Thanks.
Current Code:
<script type="text/javascript">
var isDirty = false;
var prevTabIndex = 0;
function tabChanged(sender, args){
if (isDirty){
sender.set_activeTabIndex(0);
prevTabIndex = parseInt(sender.get_activeTabIndex());
}
}
function setDirty(objID){
if (document.getElementById(objID).value != document.getElementById(objID).defaultValue){
//alert("Old Value: "+document.getElementById(objID).defaultValue+", New Value: "+document.getElementById(objID).value);
isDirty=true;}
}
</script>
<cc1:TabContainerID="TabContainer1"runat="server"Width="818px"Height="260px"ActiveTabIndex="0"OnClientActiveTabChanged="tabChanged">
<cc1:TabPanelID="TabPanel1"runat="server"HeaderText="TabA">
<HeaderTemplate>TabA</HeaderTemplate>
<ContentTemplate>
<asp:UpdatePanelID="UpdatePanel1"runat="server">
<ContentTemplate>
<asp:FormViewID="fvA"runat="server"DefaultMode="readonly"DataSourceID="dsA"OnModeChanging="changeFormViewMode">
<ItemTemplate>
FieldA :<%# Eval("FieldA") %>
</ItemTemplate>
<EditItemTemplate>
FieldA:<asp:TextBoxID="TextBoxA"runat="server"Text='<%# Bind("FieldA") %>'onchange="setDirty(this.id)"></asp:TextBox>
</EditItemTemplate>
</asp:FormView>
</ContentTemplate>
</asp:UpdatePanel>
</ContentTemplate>
</cc1:TabPanel>
<cc1:TabPanelID="TabPanel2"runat="server"HeaderText="TabB">
<HeaderTemplate>TabB</HeaderTemplate>
<ContentTemplate>
<asp:UpdatePanelID="UpdatePanel2"runat="server">
<ContentTemplate>
<asp:FormViewID="fvB"runat="server"DefaultMode="readonly"DataSourceID="dsB"OnModeChanging="changeFormViewMode">
<ItemTemplate>
FieldB :<%# Eval("FieldB") %>
</ItemTemplate>
<EditItemTemplate>
FieldB:<asp:TextBoxID="TextBoxB"runat="server"Text='<%# Bind("FieldB") %>'onchange="setDirty(this.id)"></asp:TextBox>
</EditItemTemplate>
</asp:FormView>
</ContentTemplate>
</asp:UpdatePanel>
</ContentTemplate>
</cc1:TabPanel>
Hi Sazabi,
After a quick glance, I found that there maybe a endless loop in your code. When you change the actived Tab, it will raise OnClientActiveTabChanged event and there's set_activeTabIndex() in your code, then it will raise OnClientActiveTabChanged once more.
You should do some modification. For example:
var flag = false;
function tabChanged(sender, args){
if(flag) {flag = false; return;}
flag = true;
sender.set_activeTabIndex(0);
prevTabIndex = sender.get_activeTabIndex();
}
Best regards,
Jonathan
No comments:
Post a Comment