QA@IT
«回答へ戻る

誤記訂正:2106/1/23 ⇒ 2016/1/23

1183
 
 #そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。
 
----------------- 2106/1/23 追記 ----------------
+---------------- 2016/1/23 追記 ----------------
 
 コメント欄に、
 

以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。

#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

---------------- 2016/1/23 追記 ----------------

コメント欄に、

単に「ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する」を実現するだけなら、A の Button1_Click メソッドで、自分自身の Visible プロパティを false に設定し、B の Visible プロパティを true にすればよいはずです。回答欄に例を追記しておきます。

と書きましたが、その例を書きます。A には B の参照を設定 / 取得するための UserControlB という名前のプロパティを配置します。Session や visiblePrmID プロパティは使いません。以下のような動きになります。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) 親ページの Page_Load メソッドで UserControlB に B オブジェクトへの参照を設定。

(4) A の Button1_Click メソッドで自分自身の Visible を false に、B の Visible を true に設定。

(5) 親ページがブラウザに再描画された時 A は非表示に B は表示に切り替わる。

コードは C# ですが以下の通りです。Web サイトプロジェクトでコードビハインド形式ではないので注意してください。Web アプリケーションプロジェクトでも .aspx と .aspx.cs に分ければ同じ動作をするはずです。

なお、先にも書きましたが、ユーザーコントロールの代わりに Panel とか Wizard とか MultiView を使うことも検討してみてください。そちらの方が簡単かつスマートなはずです。

<親ページ>

<%@ Page Language="C#" %>
<%@ Register src="0147-UserControl-A.ascx" tagname="uca" tagprefix="uc" %>
<%@ Register src="0147-UserControl-B.ascx" tagname="ucb" tagprefix="uc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        ucA.UserControlB = ucB; 
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <uc:uca ID="ucA" runat="server" />
        <uc:ucb ID="ucB" runat="server" Visible="False" />
    </form>
</body>
</html>

<User Control A (0147-UserControl-A.ascx)>

<%@ Control Language="C#" ClassName="_0147_UserControl_A" %>

<script runat="server">

    protected void Button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        this.UserControlB.Visible = true;
    }

    public Control UserControlB { get; set; }

</script>
<h1>User Control A</h1>
<asp:Button ID="Button1" runat="server" Text="確認画面" OnClick="Button1_Click" />

<User Control B (0147-UserControl-B.ascx)>

<%@ Control Language="C#" ClassName="_0147_UserControl_B" %>

<script runat="server">

</script>
<h1>User Control B</h1>
以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は  Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。


#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

---------------- 2016/1/23 追記 ----------------

コメント欄に、

> 単に「ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する」を実現するだけなら、A の Button1_Click メソッドで、自分自身の Visible プロパティを false に設定し、B の Visible プロパティを true にすればよいはずです。回答欄に例を追記しておきます。

と書きましたが、その例を書きます。A には B の参照を設定 / 取得するための UserControlB という名前のプロパティを配置します。Session や visiblePrmID プロパティは使いません。以下のような動きになります。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) 親ページの Page_Load メソッドで UserControlB に B オブジェクトへの参照を設定。

(4) A の Button1_Click メソッドで自分自身の Visible を false に、B の Visible を true に設定。

(5) 親ページがブラウザに再描画された時 A は非表示に B は表示に切り替わる。

コードは C# ですが以下の通りです。Web サイトプロジェクトでコードビハインド形式ではないので注意してください。Web アプリケーションプロジェクトでも .aspx と .aspx.cs に分ければ同じ動作をするはずです。

なお、先にも書きましたが、ユーザーコントロールの代わりに Panel とか Wizard とか MultiView を使うことも検討してみてください。そちらの方が簡単かつスマートなはずです。

<親ページ>

```
<%@ Page Language="C#" %>
<%@ Register src="0147-UserControl-A.ascx" tagname="uca" tagprefix="uc" %>
<%@ Register src="0147-UserControl-B.ascx" tagname="ucb" tagprefix="uc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        ucA.UserControlB = ucB; 
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <uc:uca ID="ucA" runat="server" />
        <uc:ucb ID="ucB" runat="server" Visible="False" />
    </form>
</body>
</html>
```

<User Control A (0147-UserControl-A.ascx)>

```
<%@ Control Language="C#" ClassName="_0147_UserControl_A" %>

<script runat="server">

    protected void Button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        this.UserControlB.Visible = true;
    }

    public Control UserControlB { get; set; }
    
</script>
<h1>User Control A</h1>
<asp:Button ID="Button1" runat="server" Text="確認画面" OnClick="Button1_Click" />
```

<User Control B (0147-UserControl-B.ascx)>

```
<%@ Control Language="C#" ClassName="_0147_UserControl_B" %>

<script runat="server">

</script>
<h1>User Control B</h1>
```

2106/1/23 追記

1183
 
 
 #そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。
+
+---------------- 2106/1/23 追記 ----------------
+
+コメント欄に、
+
+> 単に「ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する」を実現するだけなら、A の Button1_Click メソッドで、自分自身の Visible プロパティを false に設定し、B の Visible プロパティを true にすればよいはずです。回答欄に例を追記しておきます。
+
+と書きましたが、その例を書きます。A には B の参照を設定 / 取得するための UserControlB という名前のプロパティを配置します。Session や visiblePrmID プロパティは使いません。以下のような動きになります。
+
+(1) 初期画面では A が表示され B は非表示。
+
+(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。
+
+(3) 親ページの Page_Load メソッドで UserControlB に B オブジェクトへの参照を設定。
+
+(4) A の Button1_Click メソッドで自分自身の Visible を false に、B の Visible を true に設定。
+
+(5) 親ページがブラウザに再描画された時 A は非表示に B は表示に切り替わる。
+
+コードは C# ですが以下の通りです。Web サイトプロジェクトでコードビハインド形式ではないので注意してください。Web アプリケーションプロジェクトでも .aspx と .aspx.cs に分ければ同じ動作をするはずです。
+
+なお、先にも書きましたが、ユーザーコントロールの代わりに Panel とか Wizard とか MultiView を使うことも検討してみてください。そちらの方が簡単かつスマートなはずです。
+
+<親ページ>
+
+```
+<%@ Page Language="C#" %>
+<%@ Register src="0147-UserControl-A.ascx" tagname="uca" tagprefix="uc" %>
+<%@ Register src="0147-UserControl-B.ascx" tagname="ucb" tagprefix="uc" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<script runat="server">
+
+    protected void Page_Load(object sender, EventArgs e)
+    {
+        ucA.UserControlB = ucB; 
+    }
+</script>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head runat="server">
+    <title></title>
+</head>
+<body>
+    <form id="form1" runat="server">
+        <uc:uca ID="ucA" runat="server" />
+        <uc:ucb ID="ucB" runat="server" Visible="False" />
+    </form>
+</body>
+</html>
+```
+
+<User Control A (0147-UserControl-A.ascx)>
+
+```
+<%@ Control Language="C#" ClassName="_0147_UserControl_A" %>
+
+<script runat="server">
+
+    protected void Button1_Click(object sender, EventArgs e)
+    {
+        this.Visible = false;
+        this.UserControlB.Visible = true;
+    }
+
+    public Control UserControlB { get; set; }
+    
+</script>
+<h1>User Control A</h1>
+<asp:Button ID="Button1" runat="server" Text="確認画面" OnClick="Button1_Click" />
+```
+
+<User Control B (0147-UserControl-B.ascx)>
+
+```
+<%@ Control Language="C#" ClassName="_0147_UserControl_B" %>
+
+<script runat="server">
+
+</script>
+<h1>User Control B</h1>
+```

以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。

#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

---------------- 2106/1/23 追記 ----------------

コメント欄に、

単に「ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する」を実現するだけなら、A の Button1_Click メソッドで、自分自身の Visible プロパティを false に設定し、B の Visible プロパティを true にすればよいはずです。回答欄に例を追記しておきます。

と書きましたが、その例を書きます。A には B の参照を設定 / 取得するための UserControlB という名前のプロパティを配置します。Session や visiblePrmID プロパティは使いません。以下のような動きになります。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) 親ページの Page_Load メソッドで UserControlB に B オブジェクトへの参照を設定。

(4) A の Button1_Click メソッドで自分自身の Visible を false に、B の Visible を true に設定。

(5) 親ページがブラウザに再描画された時 A は非表示に B は表示に切り替わる。

コードは C# ですが以下の通りです。Web サイトプロジェクトでコードビハインド形式ではないので注意してください。Web アプリケーションプロジェクトでも .aspx と .aspx.cs に分ければ同じ動作をするはずです。

なお、先にも書きましたが、ユーザーコントロールの代わりに Panel とか Wizard とか MultiView を使うことも検討してみてください。そちらの方が簡単かつスマートなはずです。

<親ページ>

<%@ Page Language="C#" %>
<%@ Register src="0147-UserControl-A.ascx" tagname="uca" tagprefix="uc" %>
<%@ Register src="0147-UserControl-B.ascx" tagname="ucb" tagprefix="uc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        ucA.UserControlB = ucB; 
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <uc:uca ID="ucA" runat="server" />
        <uc:ucb ID="ucB" runat="server" Visible="False" />
    </form>
</body>
</html>

<User Control A (0147-UserControl-A.ascx)>

<%@ Control Language="C#" ClassName="_0147_UserControl_A" %>

<script runat="server">

    protected void Button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        this.UserControlB.Visible = true;
    }

    public Control UserControlB { get; set; }

</script>
<h1>User Control A</h1>
<asp:Button ID="Button1" runat="server" Text="確認画面" OnClick="Button1_Click" />

<User Control B (0147-UserControl-B.ascx)>

<%@ Control Language="C#" ClassName="_0147_UserControl_B" %>

<script runat="server">

</script>
<h1>User Control B</h1>
以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は  Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。


#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

---------------- 2106/1/23 追記 ----------------

コメント欄に、

> 単に「ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する」を実現するだけなら、A の Button1_Click メソッドで、自分自身の Visible プロパティを false に設定し、B の Visible プロパティを true にすればよいはずです。回答欄に例を追記しておきます。

と書きましたが、その例を書きます。A には B の参照を設定 / 取得するための UserControlB という名前のプロパティを配置します。Session や visiblePrmID プロパティは使いません。以下のような動きになります。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) 親ページの Page_Load メソッドで UserControlB に B オブジェクトへの参照を設定。

(4) A の Button1_Click メソッドで自分自身の Visible を false に、B の Visible を true に設定。

(5) 親ページがブラウザに再描画された時 A は非表示に B は表示に切り替わる。

コードは C# ですが以下の通りです。Web サイトプロジェクトでコードビハインド形式ではないので注意してください。Web アプリケーションプロジェクトでも .aspx と .aspx.cs に分ければ同じ動作をするはずです。

なお、先にも書きましたが、ユーザーコントロールの代わりに Panel とか Wizard とか MultiView を使うことも検討してみてください。そちらの方が簡単かつスマートなはずです。

<親ページ>

```
<%@ Page Language="C#" %>
<%@ Register src="0147-UserControl-A.ascx" tagname="uca" tagprefix="uc" %>
<%@ Register src="0147-UserControl-B.ascx" tagname="ucb" tagprefix="uc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        ucA.UserControlB = ucB; 
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <uc:uca ID="ucA" runat="server" />
        <uc:ucb ID="ucB" runat="server" Visible="False" />
    </form>
</body>
</html>
```

<User Control A (0147-UserControl-A.ascx)>

```
<%@ Control Language="C#" ClassName="_0147_UserControl_A" %>

<script runat="server">

    protected void Button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        this.UserControlB.Visible = true;
    }

    public Control UserControlB { get; set; }
    
</script>
<h1>User Control A</h1>
<asp:Button ID="Button1" runat="server" Text="確認画面" OnClick="Button1_Click" />
```

<User Control B (0147-UserControl-B.ascx)>

```
<%@ Control Language="C#" ClassName="_0147_UserControl_B" %>

<script runat="server">

</script>
<h1>User Control B</h1>
```

誤記訂正

1183
 期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。
 
 
-#そもそもユーザーコントロールを使うのがそもそも間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。
+#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。

#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は  Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。


#そもそもユーザーコントロールを使うのが間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

回答を投稿

以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。

#そもそもユーザーコントロールを使うのがそもそも間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。

以下のようになっているので期待したようにならないと思うのですが。

(1) 初期画面では A が表示され B は非表示。

(2) A の[確認画面]ボタンをクリックするとポストバックがかかる。

(3) top.aspx.vb の Page_Load メソッドに制御が飛ぶが Session("prmID") は Nothing なので何も起こらない。

(4) uc1.ascx.vb の Button1_Click メソッドに制御が飛んで Session("prmID") に文字列 "Check" が設定される。

(5) top.aspx の A, B の Visible プロパティの設定は変わらない。それゆえ、top.aspx がブラウザに再描画された時は A が表示 B は非表示のままになる。

(6) A の[確認画面]ボタンまたは top.aspx の[Button1]ボタンをクリックするとポストバックがかかる。

(7) 今度は  Session("prmID") は Nothing ではなくて文字列 "Check" が設定されているので top.aspx.vb の Page_Load メソッドで A, B の Visible プロパティが切り替わる。

期待した動きをさせるには (3) で A, B の Visible プロパティを切り替えることを考えてみてください。


#そもそもユーザーコントロールを使うのがそもそも間違っている様な気がします。「確認画面」という名前からすると、A でユーザーが情報を入力し、B で入力した情報を確認するという感じですが、そうであれば Panel とか Wizard とか MultiView を使うことをお勧めします。