web-dev-qa-db-ja.com

usercontrol内のすべてのコントロールはnullです

他のコントロールの中でも、UserControlを使用するUserControlがあります。

ascxファイルには、次のコードがあります。

<%@ Register TagPrefix="tag" Namespace="some.name.space" Assembly="some.Assembly" %>
<tag:control ID="test" runat="server" />

私のPage_Loadメソッド、私は次のようにテストでプロパティを設定しようとします:

test.Text = "Hello World!";

これにより、実際には、ユーザーコントロールtestのリテラルコントロールのTextプロパティが設定されます。

これは例外をスローします:

オブジェクト参照がオブジェクトインスタンスに設定されていません

設定しようとすると

lblTest.Text = value; 

NullのオブジェクトはlblTestです。

ユーザーコントロールを正しく追加していませんか?タグを登録するときにSrcプロパティを指定する必要がありますか?または指定する必要がありますか?もしそうなら、私は使用するすべてのユーザーコントロールを登録する必要がありますか?

これにより、usercontrolにコントロールが読み込まれなくなり、usercontrol内のすべてのコントロールがnullになります。

21
VFein

ユーザーコントロールが現在のプロジェクトにある場合は、registerステートメントにsrcを含める必要があります。

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

ただし、このユーザーコントロールを複数のページで使用する場合は、web.configに登録することもできます。

<system.web>
  <pages>
    <controls>
      <add tagPrefix="uc1" tagName="NavTop" src="~/controls/NavTop.ascx" />
    </controls>
  </pages>
</system.web>

注意すべきもう1つの点は、ソースビューで変更を加えただけでは、VisualStudioデザイナーがページ上のコントロールへの変更を「認識」しない場合があることです。たとえば、コントロール名を変更すると、ascxには新しい名前のコントロールが含まれるが、デザイナファイルには古い名前のコントロールへの参照が含まれる可能性があります。実行時に、これによりデザイナファイルのプロパティがnullになります。

これによって何度も焼き付けられた後、ソースビューに変更を加える場合は、デザイナーファイルが正しく更新されていることを確認するか、デザインビューに切り替えて小さな変更を加えてから、ページを保存します。ユーザーコントロール。

28
competent_tech

間違った方法でコードにユーザーコントロールを追加していたときに、この問題が発生しました。 newだけでは使用できないコントロールを初期化するには、Page.LoadControlメソッドを使用する必要があります。

        //WRONG
        UserControls.BingoCardPage bcp = new UserControls.BingoCardPage();
        form1.Controls.Add(bcp);
        //RIGHT
        UserControls.BingoCardPage bcp = (UserControls.BingoCardPage)Page.LoadControl("~/UserControls/BingoCardPage.ascx");
        form1.Controls.Add(bcp);
6
ascriven

ここでの問題は通常、ユーザーコントロールの読み込みメカニズムが原因であり、通常はページの後に読み込まれます。そのため、結果として、page_loadメソッドが含まれている間、コントロールはユーザーコントロールでまだ初期化されていません(null参照が発生します)。これを回避する1つの方法は、usercontrolにプロパティを作成して設定し、usercontrolにPage_Loadメソッドで独自のUIを接続/入力させることです。

このようなもの:

//Page
protected void Page_Load(object sender, EventArgs e)
{
    test.Text = "Hello World!";
}

//User Control
public string Text {get; set;}

protected void Page_Load(object sender, EventArgs e)
{
    lblTest.Text = Text;
}
5
Gary.S

ページのPage_prerenderイベントにコードを入れてみてください。それはあなたのために働くでしょう。

1
Rahul.R.Parmar