2012-03-28 14 views
0

GridViewの機能を拡張するカスタムユーザーコントロールを作成しました。 UserControlから継承し、IPostBackEventHandlerを実装します。RaisePostBackEventがユーザーコントロールのために起動しない

私が抱えている問題は、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つのコントロールだけがPage.RegisterRequiresRaiseEventを呼び出すことが許可されているように見えるため、同じページにこれらのコントロールが2つある場合、以前の解決策は機能しません。さらに、コントロールがPage.RegisterRequiresRaiseEventを呼び出すと、ページ上の他のコントロールにRaisePostBackEvent関数が呼び出されることはありません。

実際、これは私の全面的な問題でした。私はPage.RegisterRequiresRaiseEventという名前のページで別のコントロールを使用していました。そのため、FilterableGridViewはRaisePostBackEvent関数を呼び出すことができませんでした。

私はそこに何か他のことが起こっていなければならないことを知っていました...

1

、私はPage.RegisterRequiresRaiseEventを呼び出すことにより、すべてのポストバックでRaisePostBackEventを呼び出すためにASP.NETフレームワークを強制することでこの問題を回避することができました:

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

修正のおめでとう!あなたができるときは、他の人があなたの成功から学ぶことができるように、あなたの答えに「受け入れられた」と記入してください。乾杯〜 –

関連する問題