0

asp.net でウィザードを作成しています。ナビゲーション用の[次へ]ボタンと[前へ]ボタンがあるメインのaspxページがあります。各 NEXT または PREVIOUS をクリックすると、適切なユーザー コントロールが読み込まれます。

1 つのユーザー コントロールでは、以下に示すように動的チェックボックスを作成する必要があります。

    Public Class ucQuestion
    Inherits System.Web.UI.UserControl


#Region "UserControl Events"

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            If Not (Page.IsPostBack) Then
                AddControls(0)
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

#End Region
Protected Friend Sub AddControls(ByVal iListQuestionCount As Integer)
        Try
            Dim oExam As New BusinessObject.Wizard.ExamVM
            If (System.Web.HttpContext.Current.Session(BusinessLayer.Constants.WizardObjectCollection) IsNot Nothing) Then
                oExam = DirectCast(System.Web.HttpContext.Current.Session(BusinessLayer.Constants.WizardObjectCollection), BusinessObject.ExamWizard.ExamVM)
            End If

            'divQuestion.Controls.Clear()

            Dim ctrl As New Literal

            ctrl.ID = "lit" + iListQuestionCount.ToString()
            ctrl.Text = oExam.Wizard.ExamQuestions(iListQuestionCount).Label
            divQuestion.Controls.Add(ctrl)

            For iLoopChildCount As Integer = 0 To oExam.Wizard.ExamQuestions(iListQuestionCount).Choices.Count - 1
                Dim childctrl As New CheckBox
                'childctrl.AutoPostBack = True
                childctrl.ID = "chk" + (iLoopChildCount + 1).ToString()
                childctrl.Text = oExam.Wizard.ExamQuestions(iListQuestionCount).Choices(iLoopChildCount).Label
                childctrl.Checked = oExam.Wizard.ExamQuestions(iListQuestionCount).Choices(iLoopChildCount).IsSelected
                'AddHandler childctrl.CheckedChanged, AddressOf OnCheckedClick
                divQuestion.Controls.Add(childctrl)
            Next

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

ユーザーがユーザーコントロールのチェックボックスを選択した場合、問題は私のMain.aspxページにあります。次のボタンのナビゲーションクリックイベントでセッションに値を保存したいです。

NEXT Button Click で次のコードを試しましたが、失敗しました。

For iLoopChildCount As Integer = 0 To oExamQuestions(ListIndex).Choices.Count - 1
                Dim ctrl As Control
                If (ucQuestion1.FindControl("chk" + (iLoopChildCount + 1).ToString()) IsNot Nothing) Then
                    ctrl = DirectCast(ucQuestion1.FindControl("chk" + (iLoopChildCount + 1).ToString()), CheckBox)
                    If (DirectCast(ctrl, CheckBox).Checked) Then
                        oBallotQuestions(ListIndex).Choices(iLoopChildCount).IsSelected = True
                    End If
                End If
            Next
4

1 に答える 1

0

それは難しい方法です。

これが簡単な方法です。

  1. インターフェイスを定義し、このアクションを表すユーザー コントロールに実装します。これは、GetNamesOfSelectedValuesまたは適切なものである可能性があります。(技術的にはインターフェースは必須ではありませんが、良い習慣だと思いますし、多くの場合「より明確に定義されたコントラクト」に役立ちます。)
  2. 親ページのコードで、前述の子で定義されたインターフェイスを使用します。これは、子コントロール (ページ読み込みイベントの後に発生) のでのみ使用してください。そうしないと、コントロールがまだ復元されません。OnLoad

つまり、親はカスタム ユーザー コントロール内のコントロールを認識してはなりません。

このアプローチはうまく機能します。

于 2012-04-18T20:43:17.130 に答える