2

私が作成しているユーザーコントロールは、予想どおり3つのファイル(ascx、ascx.cs、およびascx.designer.cs)で構成されています。

私の問題 :

aspxページ(asp:Button runat = "server" id = "mybutton" />)で作成されたコントロールが正しく初期化されていないため、「Load」イベントにアタッチしてボタンを使用しようとすると、オブジェクトがnullになります。例外

これはVisualStudioの問題であり、奇妙なバグまたは異常な設定のいずれかであると思われますが、愚かなことをしていても驚かないでしょう。

私が試みた回避策

  1. 別のプロジェクトから別の作業中のユーザーコントロールをVisualStudioのこのプロジェクトにコピーしましたが、それも機能しません(ascxページで定義されたコントロールは、コピー元のコードでは正常に機能しますが、コードビハインドページのロードイベントではnullになります)

  2. 他のいくつかの複合コントロールで行ったように、「CreateChildControls()」メソッドを使用していますが、loadイベントとinitイベントではすべてがnullのままです。

  3. 別のソリューションとプロジェクトファイルを作成し、すべてのファイルと参照を追加しましたが、それでも状況は改善されません。

「ページライフサイクル」(コントロールライフサイクル?)が何らかの理由でコントロールを適切に初期化していないように見えますが、理由がわかりません。誰か助けてください。

リクエストとして私のコードを投稿する:

PersonalDetails.aspx
    <cwpEditControl:PersonalDetails runat="server" id="edtPersonalDetails" />

PersonalDetails.ascx
    <%@ Control Language="C#" CodeBehind="PersonalDetails.ascx.cs" Inherits="company.web.CustomerWebPortal.controls.edit.PersonalDetails" %>        
    <asp:Button runat="server" ID="myTestButton" />         

PersonalDetails.ascx.cs
    public PersonalDetails()
    {         
        this.Load += new EventHandler(PersonalDetails_Load);
    }

    void PersonalDetails_Load(object sender, EventArgs e)
    {
        this.myTestButton.Text = "Submit";  //this line creates an exception!
    }

PersonalDetails.ascx.designer.cs
    protected global::System.Web.UI.WebControls.Button myTestButton;
4

1 に答える 1

2

web.configファイルに追加して問題を修正しました。基本的には、作成しているWebアプリケーション全体にカスタムコントロールを「登録」します。

<pages>
  <controls>
    <add tagPrefix="scottgu" src="~/Controls/Header.ascx" tagName="header"/>
    <add tagPrefix="scottgu" src="~/Controls/Footer.ascx" tagName="footer"/>
    <add tagPrefix="ControlVendor" assembly="ControlVendorAssembly"/>
  </controls>
</pages>

web.configファイルへの追加を説明するリンク(この記事は私の問題に直接対処していないことに注意してください)

http://weblogs.asp.net/scottgu/archive/2006/11/26/tip-trick-how-to-register-user-controls-and-custom-controls-in-web-config.aspx

個人的には、カスタムコントロールの「サイト全体」の宣言が必要だとは思いませんが、問題が解決するので使用していますが、そのようにする必要がある理由については、それでも啓蒙したいと思います。 。

于 2012-06-07T11:57:47.473 に答える