2012-03-08 10 views
1

私はascxコントロールを持っています。別のコントロール内のasp:dropdownlistはnullですpage_loadに

protected void Page_Load(object sender, EventArgs e) 
     { 
      Languages = GetSiteLanguagesService(); 
      if (Languages.Count > 1) 
      { 

       //null reference exception here!! languageDropdown is null! 
       LanguageDropdown.Visible = true; 
       LanguageDropdown.DataTextField = "DisplayName"; 
       LanguageDropdown.DataValueField = "LangUrl"; 
       LanguageDropdown.DataSource = Languages ; 
       LanguageDropdown.DataBind(); 
      } 
     } 

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LanguageSelect.ascx.cs" Inherits="MyNamespace.LanguageSelect" %> 

の背後にあるコードで

私はLanguageSelectのPage_Loadの上でヒットデバッガで

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SomePage.ascx.cs" Inherits="myNamespace.SomePage" %> 
<div id="main" role="main"> 
    <myTag:LanguageSelect id="langSelect" runat="server" /> 
    <div class="section columns"> 
     <div class="main-column"> .... 

が、ドロップダウンはnullです!私がマークアップのドロップダウンコントロールを追加している場合は、常に存在するはずだと思っていました。この場合、動的コントロールのように振る舞います。

今、コントロールのSomePageがhtmlしかし、myTagのこの1つはレンダリングされていないので、divのドロップダウンリストをラップすると問題はありません。divもレンダリングされません。

私はSomePageをPage_Loadでブレークポイントを置く場合、langSelectコントロールが(nullではない)になりますが、それ自体がnull LanguageDropdown

+0

UserControlはページに動的に追加されていますか?なぜなら、時には、コンストラクタを使う代わりに、 'Page.LoadControl'を使ってそのインスタンスを作成しなければならないことを忘れるからです。サイドノート:ページイベントを使用して暗黙的にUserControlを初期化することは、ほとんど常に悪い考えです。その代わりに、コントローラ(通常はページ)はコントロールを直接(つまり、メソッド 'BindData'または' Init'を呼び出して)初期化する必要があります。そうしないと、ライフサイクルの問題や予期しない動作につながる可能性があります。 –

+0

@TimSchmelterいいえ、動的に追加されていません。...コントロールがマークアップとして追加されている場合、それは動的な権利ではないことを意味しますか? – lurscher

答えて

0

最後に、問題を把握しました。コントロールが他のコントロール、ASPに組み込まれている場合。オーバーライドを追加し、その後、

protected void Page_Load(object sender, EventArgs e) 
     { 
      Languages = GetSiteLanguagesService(); 
      if (Languages.Count > 1) 
      { 

       LanguageDropdown = new DropDownList(); //allocate the control 
       LanguageDropdown.Visible = true; 
       LanguageDropdown.DataTextField = "DisplayName"; 
       LanguageDropdown.DataValueField = "LangUrl"; 
       LanguageDropdown.DataSource = Languages ; 
       LanguageDropdown.DataBind(); 
      } 
     } 

と:NETは、あなたが(それが自動的にサブコントロールが表示されません)

をレンダリングオーバーライドすることを前提として私は基本的にコントロールの割り当てをPage_Loadを次のように変更し、作らなければなりませんでしたOnRenderハンドラの場合:

protected override void Render(HtmlTextWriter writer) 
     { 
      base.Render(writer); 
      LanguageDropdown.RenderControl(writer); 
     } 

この後、コントロールは完全にレンダリングされます。

+0

「コントロールが別のコントロールから継承するとき」と言わなければなりません。 「コントロールが別のコントロールに埋め込まれているとき」ではありません。彼らは2つの全く異なるものです。 – outlookrperson

+0

@rperson私は分かりません。 'LangSelect'は' SomePage'から継承しません、*それに埋め込まれています* – lurscher

5
  1. を持っているが、あなたのユーザーコントロールをページに動的に追加されますか?私は人々が時々コンストラクタを使う代わりにPage.LoadControlを介してインスタンスを作成しなければならないことを忘れるために尋ねています。
  2. UserControlをページに登録しましたか?たとえば、

<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %> 

サイドノート:それは暗黙的にUserControlをinititializeするページイベントを使用するために、ほとんど常に悪い考えです。代わりにコントローラ(通常はページ)は、コントロールを直接呼び出す(BindDataまたはInitなどのメソッドを呼び出すことによって)コントロールを初期化する必要があります。 それ以外の場合は、ライフサイクルの問題や厄介なエラーにつながる可能性があります。

+0

よく、ユーザーコントロール自体がサイト内サブレイアウト – lurscher

+0

コントロールが動的であるかどうかは関係ありません(そして、そうではありません)。なぜなら、私がLanguageDropdownを割り当ててページに追加しようとすると、ロード、初期化、レンダリングイベントのページを変更できないためエラーが発生します – lurscher

1

自動生成された ".ascx.designer.cs"ファイルを削除して再生成してください。これを行うには、次の手順を実行します

  • た.ascxを削除* designer.cs
  • ASCXファイルを右クリックし、 "Webアプリケーションへの変換" を選択

デザイナーを。 .csファイルが再作成されます。物事が今働くかどうかを見てください。

+0

はうまく動作せず、designer.csはマークアップと同期しているようです。 – lurscher

1

UserControl(.ascx)をCustomControl(no .ascx)として読み込もうとしている可能性があります。ページとweb.configのページ/コントロールセクションで、.ascxパスではなくLanguageSelectの名前空間への参照を確認してください。

関連する問題