我创建了一个自定义用户控件,用于扩展GridView的功能。它继承自UserControl并实现IPostBackEventHandler。
我遇到的问题是框架不会调用IPostBackEventHandler.RaisePostBackEvent函数SOMETIMES。我已将此控件放在多个页面上,在某些页面上它可以正常工作,而在某些页面上却没有。我检查了Request [“__ EVENTTARGET”]并验证它等于控件的UniqueID,但仍然没有调用RaisePostBackEvent。
是否有人知道可能无法调用RaisePostBackEvent的原因?
以下是我的用户控件的代码:
namespace Warrior.PL.Controls
{
/// <summary>
/// A GridView that supports filter fields at the top of each column.
/// </summary>
[ParseChildren(ChildrenAsProperties = true)]
[ToolboxData("<{0}:FilterableGridView runat=\"server\"></{0}:FilterableGridView>")]
public partial class FilterableGridView : UserControl, IPostBackEventHandler
{
...
#region IPostBackEventHandler Members
void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
if (eventArgument != null && eventArgument.StartsWith("Filter"))
{
OnFiltering(new GridViewFilterEventArgs()); // This is a function that I created
}
}
#endregion
...
}
}
以下是其中一个有效页面的控件实现:
<warrior:FilterableGridView ID="gvItemCert" runat="server" AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" CellPadding="4" CssClass="GridView"
OnPageIndexChanging="gvItemCert_PageIndexChanging" OnRowDataBound="gvItemCert_RowDataBound" OnSorting="gvItemCert_Sorting" OnFiltering="gvItemCert_Filtering" PageSize="100">
...
</warrior:FilterableGridView>
以下是页面上无法正常工作的实现:
<warrior:FilterableGridView ID="gvEquipSN" runat="server" AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" CellPadding="4" CssClass="GridView" EnableViewState="false"
OnPageIndexChanging="gvEquipSN_PageIndexChanging" OnRowDataBound="gvEquipSN_RowDataBound" OnSorting="gvEquipSN_Sorting" OnFiltering="gvEquipSN_Filtering" PageSize="20">
...
</warrior:FilterableGridView>
我看到的唯一区别是不起作用的那个有EnableViewState =“false”。不过,我已经将此排除在外,因为设置EnableViewState =“true”对任何事都没有帮助。
另外,我在两个页面都使用AJAX。
答案 0 :(得分:1)
为了阅读本文的任何人的兴趣,我能够通过强制ASP.NET框架通过调用Page.RegisterRequiresRaiseEvent在每个回发上调用RaisePostBackEvent来解决这个问题:
protected override void OnInit(EventArgs e)
{
Page.RegisterRequiresRaiseEvent(this);
base.OnInit(e);
}
然后我必须修改RaisePostBackEvent以检查事件目标:
void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
string eventTarget = Request["__EVENTTARGET"];
if (eventTarget == UniqueID)
{
// eventArgument is null so we have to retrieve it ourselves
eventArgument = Request["__EVENTARGUMENT"];
if (eventArgument.StartsWith("Filter"))
{
OnFiltering(new GridViewFilterEventArgs());
}
}
}
我真的不喜欢这个解决方案,因为我似乎正在修复症状,而不是问题。但它现在可以使用。
答案 1 :(得分:0)
事实证明,如果在同一页面上有两个这样的控件,之前的解决方案不起作用,因为显然只允许页面上的一个控件调用Page.RegisterRequiresRaiseEvent。此外,如果控件调用Page.RegisterRequiresRaiseEvent,则页面上的其他任何控件都不会调用它们的RaisePostBackEvent函数。
实际上,这是我的全部问题:我在页面上有另一个控件,调用了Page.RegisterRequiresRaiseEvent,所以我的FilterableGridView从未调用它的RaisePostBackEvent函数!
我知道所有这些都必须有其他东西......