2012-04-18 65 views
0

我在asp.net中構建了一個嚮導。我有一個主要的aspx頁面,將有導航的下一個和上一個按鈕。點擊每個NEXT或PREVIOUS,將加載適當的用戶控件。從容器頁面訪問用戶控件中動態創建的複選框

在一個用戶控件我要創建動態複選框,如下圖所示:

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按鈕中點擊了下面的代碼,但它沒有完成。

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 

回答

0

這是困難的方法。

這裏是簡單的方法。

  1. 定義interface並在表示此操作的用戶控件中實現它。這可能是GetNamesOfSelectedValues或任何適當的。 (從技術上說,不需要接口,但我認爲這是很好的做法,並且在很多情況下它使得「更明確的合同」成爲可能。)
  2. 使用Parent頁面代碼中所述Child上定義的接口。在子控件的OnLoad(發生頁面加載事件後)之後,只能使用,否則控件將不會恢復。

也就是說,父母不應該知道約自定義用戶控件中的任何控件。

這種方法效果很好。

+0

我不明白你可以請舉一個例子 – 2012-04-18 20:55:36

+0

好吧,首先開始定義一個接口(請參閱鏈接):父母*需要知道/訪問什麼?然後讓接口的類實現。 – 2012-04-18 21:03:49

相關問題