2

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

我不明白为什么这个事件会自动触发,即使我不是故意触发它。在这种情况下如何触发 RowCommand 事件?我尝试了更新面板和没有更新面板。

4

3 回答 3

3

这很奇怪,但如果活动选项卡发生更改或实际 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;
        }
    }
}
于 2012-07-09T15:41:40.053 回答
0

对于使用 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

结束命名空间

Yuriy Rozhovetskiy 的道具

于 2013-04-04T22:05:19.227 回答
0

我也无缘无故地触发了 ActiveTabChanged 事件。

我用下面的方法修复了它;将此作为 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

如果事件来自除 tabMain 之外的任何地方(在上面的示例中),请退出。

这解决了我几个小时的挫败感!

于 2015-09-01T03:48:27.397 回答