RaisePostBackEvent не запускается для пользовательского контроля - PullRequest
0 голосов
/ 29 марта 2012

Я создал пользовательский элемент управления, предназначенный для расширения функциональности GridView. Он наследуется от UserControl и реализует IPostBackEventHandler.

Проблема, с которой я столкнулся, заключается в том, что функция SOMETIMES IPostBackEventHandler.RaisePostBackEvent не вызывается платформой. Я разместил этот элемент управления на нескольких страницах, и на некоторых страницах он работает нормально, а на некоторых страницах - нет. Я проверил 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 на обеих страницах.

Ответы [ 2 ]

1 голос
/ 04 апреля 2012

В интересах любого, кто читает это, я смог обойти эту проблему, заставив платформу ASP.NET вызывать RaisePostBackEvent при каждой обратной передаче, вызвав Page.RegisterRequiresRaiseEvent:

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());
        }
    }
}

Мне не очень нравится это решение, потому что кажется, что я исправляю симптом, а не проблему.Пока это работает.

0 голосов
/ 10 апреля 2012

Оказывается, что предыдущее решение не работает, если на одной странице есть два из этих элементов управления, потому что, очевидно, только ОДИН элемент управления на странице может вызывать Page.RegisterRequiresRaiseEvent. Кроме того, , если элемент управления вызывает Page.RegisterRequiresRaiseEvent, тогда ни один из других элементов управления на странице не получает свою функцию RaisePostBackEvent.

Фактически, это была вся моя проблема: у меня был другой элемент управления на странице, который назывался Page.RegisterRequiresRaiseEvent, поэтому мой FilterableGridView никогда не получал свою функцию RaisePostBackEvent!

Я знал, что под всем этим должно происходить что-то еще ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...