2

各タブにグリッドを含むAjaxタブコントロールを使用しています。グリッドにはドロップダウンリストとボタンがあり、gridviewRowのボタンクリックでgridviewのRowCommandイベントを発生させたいです。ただし、問題は、ボタンをクリックするたびにTabcontainet_ActiveTabChangedイベントが発生し、RowCommandイベントが発生する前にグリッドビューが再度バインドされることです。

意図的に発生させていないのに、なぜこのイベントが自動的に発生するのかわかりません。このような場合、どうすればRowCommandイベントを発生させることができますか?更新パネルありと更新パネルなしの両方を試しました。

4

3 に答える 3

3

これは非常に奇妙ですが、アクティブなタブが変更された場合、または実際のActiveTabIndexプロパティ値が0に等しい場合、TabContainerは各ポストバックでActiveTabChangedイベントを発生させます。そのような動作の理由を見つけることができないため、自己責任で以下のソリューションを使用してください。実際に利用できるソリューションは2つあります。1つは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

名前空間の終了

YuriyRozhovetskiyへの小道具

于 2013-04-04T22:05:19.227 に答える
0

私も理由もなくActiveTabChangedイベントを発生させていました。

以下で修正しました。これをActiveTabChangedイベントの最初の行として配置します。「tabMain」を実際のタブIDに変更します。

        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 に答える