我正在使用 Ajax 选项卡控件,它在每个选项卡中都包含网格。网格有下拉列表和按钮,我想在 gridview Row 的按钮单击时触发 gridview 的 RowCommand 事件。但问题是,每当我单击按钮时,Tabcontainet_ActiveTabChanged 事件就会被触发,并且网格视图会在触发 RowCommand 事件之前再次绑定。
我不明白为什么这个事件会自动触发,即使我不是故意触发它。在这种情况下如何触发 RowCommand 事件?我尝试了更新面板和没有更新面板。
我正在使用 Ajax 选项卡控件,它在每个选项卡中都包含网格。网格有下拉列表和按钮,我想在 gridview Row 的按钮单击时触发 gridview 的 RowCommand 事件。但问题是,每当我单击按钮时,Tabcontainet_ActiveTabChanged 事件就会被触发,并且网格视图会在触发 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;
}
}
}
对于使用 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 的道具
我也无缘无故地触发了 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 之外的任何地方(在上面的示例中),请退出。
这解决了我几个小时的挫败感!