Ajax选项卡控件';s TabContainer\u ActiveTabChanged事件在每次回发时触发

Ajax选项卡控件';s TabContainer\u ActiveTabChanged事件在每次回发时触发,ajax,postback,ajaxcontroltoolkit,tabcontrol,Ajax,Postback,Ajaxcontroltoolkit,Tabcontrol,我使用的是Ajax选项卡控件,每个选项卡中都包含网格。网格有下拉列表和按钮,我想在单击gridview行的按钮时触发gridview的RowCommand事件。但问题是,每当我单击按钮时,就会触发Tabcontainet_ActiveTabChanged事件,而grid view会在触发RowCommand事件之前再次绑定 我无法理解为什么此事件会自动触发,即使我不是故意触发它。在这种情况下,如何激发RowCommand事件?? 我尝试了使用更新面板和不使用更新面板。这很奇怪,但如果活动选项卡更

我使用的是Ajax选项卡控件,每个选项卡中都包含网格。网格有下拉列表和按钮,我想在单击gridview行的按钮时触发gridview的RowCommand事件。但问题是,每当我单击按钮时,就会触发Tabcontainet_ActiveTabChanged事件,而grid view会在触发RowCommand事件之前再次绑定

我无法理解为什么此事件会自动触发,即使我不是故意触发它。在这种情况下,如何激发RowCommand事件??
我尝试了使用更新面板和不使用更新面板。

这很奇怪,但如果活动选项卡更改或实际的ActiveTabIndex属性值等于0,则TabContainer会在每次回发时触发ActiveTabChanged事件。我找不到这种行为的任何原因,所以请使用下面的解决方案,风险自负。实际上有两种解决方案:第一种是下载AjaxControlToolkit源代码,更改TabContainer控件LoadPostData方法并使用自定义dll:

实际方法:

protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
    int tabIndex = ActiveTabIndex;
    bool result = base.LoadPostData(postDataKey, postCollection);
    if (ActiveTabIndex == 0 || tabIndex != ActiveTabIndex)
    {
        return true;
    }
    return result;
}
只需从上面的代码中删除
ActiveTabIndex==0
条件

或者,您可以创建从TabContainer继承的自己的类,重写该方法并使用该类而不是默认类:

namespace AjaxControlToolkit
{
    /// <summary>
    /// Summary description for MyTabContainer
    /// </summary>
    public class MyTabContainer : TabContainer
    {
        protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
            int tabIndex = ActiveTabIndex;

            if (SupportsClientState)
            {
                string clientState = postCollection[ClientStateFieldID];
                if (!string.IsNullOrEmpty(clientState))
                {
                    LoadClientState(clientState);
                }
            }

            if (tabIndex != ActiveTabIndex)
            {
                return true;
            }
            return false;
        }
    }
}
命名空间AjaxControlToolkit
{
/// 
///MyTabContainer的摘要说明
/// 
公共类MyTabContainer:TabContainer
{
受保护的覆盖布尔LoadPostData(字符串postDataKey,System.Collections.Specialized.NameValueCollection postCollection)
{
int-tabIndex=ActiveTabIndex;
如果(SupportsClientState)
{
字符串clientState=postCollection[ClientStateFieldID];
如果(!string.IsNullOrEmpty(clientState))
{
LoadClientState(客户端状态);
}
}
if(tabIndex!=ActiveTabIndex)
{
返回true;
}
返回false;
}
}
}

对于使用VB.NET的任何人:

Namespace AjaxControlToolkit
Public Class MyTabContainer
    Inherits TabContainer

    Protected Overrides Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean
        Dim tabIndex = ActiveTabIndex

        If SupportsClientState Then
            Dim clientState = postCollection(ClientStateFieldID)
            If Not String.IsNullOrEmpty(clientState) Then
                LoadClientState(clientState)
            End If
        End If

        If tabIndex <> ActiveTabIndex Then
            Return True
        End If

        Return False
    End Function
End Class
命名空间AjaxControlToolkit
公共类MyTabContainer
继承TabContainer
受保护的重写函数LoadPostData(postDataKey作为字符串,postCollection作为NameValueCollection)作为布尔值
Dim tabIndex=ActiveTabIndex
如果支持客户端状态,则
Dim clientState=postCollection(ClientStateFieldID)
如果不是String.IsNullOrEmpty(clientState),则
LoadClientState(客户端状态)
如果结束
如果结束
如果tabIndex ActiveTabIndex,则
返回真值
如果结束
返回错误
端函数
末级
结束命名空间


Yuriy Rozhovetskiy的道具

我也无缘无故地让ActiveTab更改了事件火

我把它固定在下面;将其作为ActiveTabChanged事件的第一行。使用实际选项卡id更改“tabMain”:

        Dim ctrl As Control = Nothing

        'get the event target name and find the control
        Dim ctrlName As String = Page.Request.Params.Get("__EVENTTARGET")
        If (Not String.IsNullOrEmpty(ctrlName)) Then
            ctrl = Page.FindControl(ctrlName)

            If ctrl IsNot Nothing Then
                If ctrl.ID <> "tabMain" Then
                    Exit Sub
                End If
            End If
        Else
            Exit Sub
        End If
Dim ctrl As Control=Nothing
'获取事件目标名称并找到控件
Dim ctrlName As String=Page.Request.Params.Get(“\uu EVENTTARGET”)
如果(不是String.IsNullOrEmpty(ctrlName)),则
ctrl=Page.FindControl(ctrlName)
如果ctrl不是空的,那么
如果ctrl.ID为“tabMain”,则
出口接头
如果结束
如果结束
其他的
出口接头
如果结束
如果事件来自tabMain以外的任何地方(在上面的示例中),请退出

这为我解决了几个小时的挫折