QA@IT
«質問へ戻る

質問を投稿

ユーザーコントロール内のイベントで親webフォーム内の要素のパラメータを変更したい

ASP.NET(VB)で開発を行っています。
プログラミングは未経験のため拙い文書、コードではありますがご教授頂きたく思います。

実現したい挙動が以下のように、ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する処理です。

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

uc1のbuttonをクリックしたタイミングでuc1とuc2のvisible切替を行いたいのですが、uc1のButton1_Clickイベントが走る前にtopのPage_Loadイベントが走るため、 Select Case処理内でのvisivle切り替えがうまく行きません。
uc1のButton1_Clickイベント時のSession("prmID")の値は残っているので、再度Button1_Clickイベントを起こす or topのButton1_Clickイベントを発生させてポストバックさせるとvisibleは切り替わります。

何か処理が足りないのか、そもそもパラメータの切り替えをする正しい方法があるのか、ご教授お願い致します。

<top.aspx>

(head略)
<body>
    <form id="form1" runat="server">
        <asp:Button ID="Button1" runat="server" Text="Button" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <contents:uc1 ID="uc1" runat="server" Visible="true" />
        <contents:uc2 ID="uc2" runat="server" Visible="false" />
    </form>
</body>

<top.aspx.vb>

Public Class top
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
        Else
            Select Case Session("prmID")
                Case "Check"
                    uc1.Visible = False
                    uc2.Visible = True
            End Select
        End If
    End Sub

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

<uc1.ascx>

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="uc1.ascx.vb" Inherits="Page_uc1" %>
<h2>最初の画面</h2>
    <asp:Button ID="Button1" runat="server" Text="確認画面" />

<uc1.ascx.vb>

Public Class Page_uc1
    Inherits System.Web.UI.UserControl
    Public prmID As String
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not IsPostBack Then
        Else
            prmID = Session("prmID")
        End If
    End Sub

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

    Public Property visiblePrmID() As String
        Get
            Return prmID
        End Get
        Set(ByVal value As String)
            If value Is Nothing Then
                prmID = ""
            Else
                prmID = value
            End If
        End Set
    End Property
End Class

<uc2.ascx>

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="uc2.ascx.vb" Inherits="Page_uc2" %>
<h2>2つ目の画面</h2>
ASP.NET(VB)で開発を行っています。
プログラミングは未経験のため拙い文書、コードではありますがご教授頂きたく思います。

実現したい挙動が以下のように、ユーザーコントロールAの押下イベントで、親のwebフォームに配置した別のユーザーコントロールBのvisibleのプロパティ値を変更する処理です。

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

uc1のbuttonをクリックしたタイミングでuc1とuc2のvisible切替を行いたいのですが、uc1のButton1_Clickイベントが走る前にtopのPage_Loadイベントが走るため、 Select Case処理内でのvisivle切り替えがうまく行きません。
uc1のButton1_Clickイベント時のSession("prmID")の値は残っているので、再度Button1_Clickイベントを起こす or topのButton1_Clickイベントを発生させてポストバックさせるとvisibleは切り替わります。

何か処理が足りないのか、そもそもパラメータの切り替えをする正しい方法があるのか、ご教授お願い致します。

<top.aspx>
```
(head略)
<body>
    <form id="form1" runat="server">
        <asp:Button ID="Button1" runat="server" Text="Button" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <contents:uc1 ID="uc1" runat="server" Visible="true" />
        <contents:uc2 ID="uc2" runat="server" Visible="false" />
    </form>
</body>
```
<top.aspx.vb>
```
Public Class top
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
        Else
            Select Case Session("prmID")
                Case "Check"
                    uc1.Visible = False
                    uc2.Visible = True
            End Select
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = uc1.visiblePrmID()
    End Sub
End Class
```
<uc1.ascx>
```
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="uc1.ascx.vb" Inherits="Page_uc1" %>
<h2>最初の画面</h2>
    <asp:Button ID="Button1" runat="server" Text="確認画面" />
```
<uc1.ascx.vb>
```
Public Class Page_uc1
    Inherits System.Web.UI.UserControl
    Public prmID As String
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not IsPostBack Then
        Else
            prmID = Session("prmID")
        End If
    End Sub

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

    Public Property visiblePrmID() As String
        Get
            Return prmID
        End Get
        Set(ByVal value As String)
            If value Is Nothing Then
                prmID = ""
            Else
                prmID = value
            End If
        End Set
    End Property
End Class
```
<uc2.ascx>
```
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="uc2.ascx.vb" Inherits="Page_uc2" %>
<h2>2つ目の画面</h2>
```