Ajax选项卡控件';s TabContainer\u ActiveTabChanged事件在每次回发时触发
我使用的是Ajax选项卡控件,每个选项卡中都包含网格。网格有下拉列表和按钮,我想在单击gridview行的按钮时触发gridview的RowCommand事件。但问题是,每当我单击按钮时,就会触发Tabcontainet_ActiveTabChanged事件,而grid view会在触发RowCommand事件之前再次绑定 我无法理解为什么此事件会自动触发,即使我不是故意触发它。在这种情况下,如何激发RowCommand事件??Ajax选项卡控件';s TabContainer\u ActiveTabChanged事件在每次回发时触发,ajax,postback,ajaxcontroltoolkit,tabcontrol,Ajax,Postback,Ajaxcontroltoolkit,Tabcontrol,我使用的是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以外的任何地方(在上面的示例中),请退出
这为我解决了几个小时的挫折