6

ページの初期化で次のコードを使用して動的にページに読み込まれるユーザー コントロールがあります。

Dim oCtl As Object
oCtl = LoadControl("~/Controls/UserControl1.ascx")

oCtl.Id = "UserControl11"
PlaceHolder1.Controls.Clear()
PlaceHolder1.Controls.Add(oCtl)

ユーザー コントロールにはボタンも含まれており、ユーザー コントロール内でボタンのクリックをキャプチャできません。

4

9 に答える 9

10

あなたがやっていることがいくつかありますが、それらは両方とも必要ではなく、おそらく問題を引き起こしています.

これらは:

  1. コントロール オブジェクトをセッションに格納する必要はありません。コントロール自体は、インスタンス全体ではなく、必要に応じて情報を格納するために ViewState と Session State を使用する必要があります。
  2. コントロールを作成するときに PostBack をチェックするべきではありません。ViewState が機能し、イベントが関連付けられるようにするには、毎回作成する必要があります。
  3. ViewState が読み込まれた後に読み込まれたコントロールは、正しく動作しないことが多いため、Page Load イベント中は可能な限り読み込みを避けてください。

このコードは私のために働きます:


デフォルト.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="Test_User_Control._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title></title></head>
<body>
    <form id="form1" runat="server">
        <asp:PlaceHolder ID="PlaceHolder1" runat="server" />
    </form>
</body>
</html>

Default.aspx.vb

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

        Dim control As Control = LoadControl("~/UserControl1.ascx")
        PlaceHolder1.Controls.Add(control)

    End Sub
End Class

UserControl1.ascx

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UserControl1.ascx.vb" Inherits="Test_User_Control.UserControl1" %>
<asp:Label ID="Label1" Text="Before Button Press" runat="server" />
<asp:Button ID="Button1" Text="Push me" runat="server" />

UserControl1.ascx.vb

Public Partial Class UserControl1
    Inherits System.Web.UI.UserControl

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "The button has been pressed!"
    End Sub

End Class

于 2008-10-14T13:35:31.813 に答える
5

.NET がページ ライフサイクルの「ポストバック イベント処理」ステップに入る前に、ページにコントロールが存在することを確認する必要があります。コントロールは動的に追加されるため、ポストバックごとにそのコントロールを再作成して、イベントを発生させるコントロールを見つけることができるようにする必要があります。

于 2008-09-18T14:26:19.843 に答える
3

すべてのポストバックでコントロールをロードするようにしてください。ページがポストバックするときにコントロールがコントロールのツリーにない場合、ASP.NETはボタンクリックイベントを発生させません。

于 2008-09-18T14:17:08.947 に答える
2

私の場合、コントロールを保存するためにセッションを使用しなかったことを除いて、私はあなたと同様の問題を経験しました。

私の場合、次の行に問題を見つけました。

PlaceHolder1.Controls.Clear()

私がしたことは、子コントロールを作成し、それらを Page_Init の親コンテナーに追加してから、いくつかのイベント ハンドラーを処理し、その後 Page_PreRender で、更新されたデータでリスト全体を再作成しました。

この場合に使用した解決策は、ページ サイクルの初期段階で、コントロール コレクションを 1 回作成することでした。

于 2009-02-13T11:05:22.803 に答える
1

いくつかの質問:

  1. ページのライフサイクルのどの時点でコントロールをロードしますか?
  2. イベント ハンドラ コードはどこにありますか? コントロール自体で、またはページに接続しようとしていますか?
  3. イベントを開催するためにこれまでに何をしましたか?

最後に、.Net のスタイル ガイドラインでは、oCtl の o のようなヒューガリア語の接頭辞を使用しないことを特に推奨しており、オブジェクトではなくコントロールとして入力する必要があります。

于 2008-09-18T14:03:31.817 に答える
0

試してみないとわかりませんが、ボタンのイベントハンドラーをプログラムで接続するとどうなりますか?たとえば、ユーザーコントロール自体のコードビハインドでは、InitまたはLoad(不明)で次のようになります。

AddHandler Button1.Click, AddressOf Button1_Click

それでも何も起こらない場合は、効率が悪いことはわかっていますが、ユーザーコントロールインスタンスをSessionに保存せず、常にPage_Initで再作成するとどうなるでしょうか。

于 2008-09-18T15:42:15.823 に答える
0

ページの完全なコードは次のとおりです

Partial Class DynamicLoad
    Inherits System.Web.UI.Page

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        If IsPostBack Then
            If Not (Session("ctl") Is Nothing) Then
                Dim oCtl As Object
                oCtl = Session("ctl")
                PlaceHolder1.Controls.Add(oCtl)
            End If
        End If
    End Sub


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            Dim oCtl As Object
            oCtl = LoadControl("~/Controls/UserControl1.ascx")

            oCtl.Id = "UserControl11"
            PlaceHolder1.Controls.Clear()
            PlaceHolder1.Controls.Add(oCtl)

            Session("ctl") = oCtl
        End If
    End Sub
End Class

ユーザーコントロールの完全なコードは次のとおりです

Partial Class UserControl1
    Inherits System.Web.UI.UserControl
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "This is Text AFTER Post Back in User Control 1"
    End Sub
End Class
于 2008-09-18T14:37:30.940 に答える
0

あなたが尋ねたので、私はあなたの初期化イベントをこのように書きます。Load イベントは演習として残します。

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If IsPostBack AndAlso Session("ctl") IsNot Nothing Then
        Dim MyControl As Control = Session("ctl")
        PlaceHolder1.Controls.Add(MyControl)
    End If
End Sub

また、「mycontrol」よりも適切な名前を思いつきますが、コントロールが何をするかわからないため、これを行う必要があります。

于 2008-09-18T15:00:40.353 に答える
-1

isPostBack でない場合にのみコントロールをロードしたい

于 2008-09-18T14:08:29.327 に答える