QA@IT

[ASP.NET]ユーザーコントロールのイベント結果をwebフォームで取得できない

4242 PV

ASP.NET,VB.NET初心者です。
以下のように、ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する処理を行いたいです。

A:Visible=true
B:Visible=false
↓ ユーザーコントロールA内のbutton押下
A:Visible=false
B:Visible=true

まずはこちらを参考にユーザーコントロール内のイベント結果をwebフォームで取得するコードを書いたのですが、Button押下時に「オブジェクト参照がオブジェクトインスタンスに設定されていません」とエラーが発生してしまいます。

<default.aspx>

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="productList.ascx" TagName="pList" TagPrefix="contents" %>
(略)
<body>
  <form id="form1" runat="server">
    <div>
      <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><asp:Button ID="Button1" runat="server" Text="Button" />
      <contents:pList ID="productList" runat="server" Visible="false" />
    </div>
  </form>
</body>

<default.aspx.vb>

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected prm As Page_productList
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = prm.visiblePrmID()
    End Sub

End Class

<productList.ascx>

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="productList.ascx.vb" Inherits="Page_productList" %>
    <asp:Button ID="Button1" runat="server" Text="実行" />

<productList.ascx.vb>

Partial Class Page_productList
    Inherits System.Web.UI.UserControl

    Private prmID As String
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        prmID = "Check"
    End Sub

    Public Property visiblePrmID() As String
        Get
            Return prmID
        End Get
        Set(ByVal value As String)
            prmID = value
        End Set
    End Property
End Class

デバッグにて<default.aspx.vb>のButton1_Clickイベントで「Label1.Text = prm.visiblePrmID()」のprmがNothingになっているのが確認出来ました。
直前の「Protected prm As Page_productList」の宣言が良くないのでしょうか?

ご教授よろしくお願い致します。

<2015年1月19日追記>
今回の質問は冒頭のvisible切替ではなく、あくまでユーザーコントロールA内の変数の値を親webフォーム取得する質問です。
値の取得に関しましては、丁寧な指導のおかげで実現することが出来ました。
紛らわしい記載をしてしまい誠に申し訳ございません。

回答

「Label1.Text = prm.visiblePrmID()」のprmがNothingになっているのが確認出来ました。

ASP.NET と言うより、プログラミングの基本的なところなんですが、default.aspx.vb で変数 prm を宣言した後それに何も代入してないから Nothing になるのでしょう。

prm = productList とした後ならうまく行くのではないかと思います。

それより、ユーザーコントロールは静的に Page に配置してあるのですから、変数 prm など使わなくても、以下のようにすれば OK と思います。お試しください。

Label1.Text = productList.visiblePrmID()

(注)上記で Nothing となってしまうという問題が解決できたとしても、その後の全体的な動きが質問者さんの期待どおりになるかまでは自分は考えていませんので、もしまだ他に問題があるようでしたらその旨連絡ください。

編集 履歴 (1)
  • 回答ありがとうございます!
    変数 prm の宣言後に代入する必要があったのですね・・・ありがとうございます。
    教えて頂いた通り記載するとエラーなく処理されました。
    ですが1点上手く行かないところがあり、productList.ascx.vbの「prmID = "Check"」後、visiblePrmID()が処理される際、変数prmがNothingになってしまいます。
    なぜでしょうか・・・
    -
  • default.aspx に配置したユーザーコントロールの Visible="false" になってますがそのせいではないのですか? すみませんがアップされているコードはよく分からないです。それが全てだとすると期待通り動くとは思えないのですが。 -
  • ASP.NETのページ上のオブジェクトは、基本的にはポストバックのたびに再作成されます
    ユーザーコントロールのプロパティはビューステート等に保存して、ロード時に復帰させないと複数のポストバックで値を保持できません
    -
  • SurferOnWww様、Takac様、回答ありがとうございます!
    >ASP.NETのページ上のオブジェクトは、基本的にはポストバックのたびに再作成されます
    なるほど。変数prmの値が消えたというより、変数prmが再作成されたためにnothingになっていたのですね。ポストバックの知識不足でした・・・
    再度ソースコードを見直してみます!ありがとうございました!
    -
  • 何か勘違いがあると思いますが。先のコメントで「アップされているコードはよく分からない」と書きましたが、そのことを考えていただけませんか? 最初の質問に 2 つのユーザーコントロール A, B の Visible プロパティを切り替えると書いてあるのに、コードには 1 つしかないし・・・ -
  • たぶん、アップされたコードが全てではないと思われますが、そうであれば 2 つのユーザーコントロール A, B を含めて、問題を再現できる必要最小限のコードをアップしてください。その際、最初にアップしたコードを変更すると話がつながらなくなるので、最初の質問に追記する形でお願いします。 -
  • そして、どういう手順でそのコードを実行すると、どこでどのような問題が出るのか書いてください。 -
  • >SurferOnWww様
    紛らわしい書き方をして申し訳ございません。最終目的はユーザーコントロールAとBのVisibleプロパティ切替なのですが、そこに至る前にユーザーコントロールA内の変数を親webフォームが取得できない問題で詰まっておりました。
    ですので、visible切替のコードどころかユーザーコントロールBの作成まで至っておりません。
    -
  • 今回の質問はvisible切替ではなく、あくまでユーザーコントロール内の変数の値を取得する質問であったことを最初の質問に追記させていただきます。
    また、最初の質問にvisible切替の問題を追記すると他の方が混乱してしまう可能性がありますので、新たな質問として再度投稿させて頂きます。
    ご迷惑をおかけしてしまい申し訳ございませんでした。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。