2016-12-12 9 views
0

リピータでダイナミックフォームを作成しました。フォームを送信した後、私のダイナミックコントロールはどこにありますか?

<asp:repeater ID="fieldRepeater" OnItemDataBound="dataBound" runat="server"> 
    <itemtemplate> 
     <div id="controlRow" class="row" runat="server"> 
      <div id="testContainer" class="col-md-2" runat="server"> 

      </div> 
     </div> 
    </itemtemplate> 
</asp:repeater> 

コードビハインド私はそれに表示したいフィールドを作成しました。

Protected Sub dataBound(ByVal sender As Object, e As RepeaterItemEventArgs) 
    dim temp as new DropDownList 
    dim tempLabel as new label 
    Dim testContainer As HtmlGenericControl = e.Item.FindControl("testContainer") 

    'createField 
    temp.ID = "testField" & e.Item.ItemIndex 'this is testField0 
    temp.Items.Add(New ListItem("Not Used", 0)) 
    temp.Items.Add(New ListItem("Used", 1)) 
    temp.CssClass = "form-control" 


    'createLabel 
    tempLabel.ID = "testFieldLabel" & e.Item.ItemIndex 
    tempLabel.AssociatedControlID = "testField" & e.Item.ItemIndex 
    tempLabel.Text = dr("controlLabel") 
    testContainer.Controls.Add(temp) 
    testContainer.Controls.Add(tempLabel) 
end sub 

フォームが美しく動作し、私もDBからのデータとそれを事前に取り込むことができますが、私の提出ハンドラで、私のコントロールは存在しません:

Protected Sub submit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles submit.Click 
    Dim i As Int32 = 0 
    For Each r As DataRow ... 
     'db stuff 
     Dim temp As New DropDownList 
     temp = Me.FindControl("testField" & i.ToString) 
     'db stuff    
     i += 1 
    next 
end sub 

temp = Me.FindControl("testField" & i.ToString)は常にnothingであることができる人なぜ私が知るのを手助けしますか?

<div id="cntMain_fieldRepeater_testContainer_0" class="col-md-2"> 
    <label for="cntMain_fieldRepeater_testField0_0" id="cntMain_fieldRepeater_testFieldLabel0_0" style="color:#007AFF;">Activity</label> 
    <select name="ctl00$cntMain$fieldRepeater$ctl00$testField0" id="cntMain_fieldRepeater_testField0_0" class="form-control"> 
     <option value="0">Not Used</option> 
     <option value="1">Used</option> 
    </select> 
</div> 

答えて

1

動的に作成されたコントロールは、すべてのページの読み込みで作成した(再)する必要があり、それはポストバックが含まれています

私のHTML出力は次のようになります。したがって、!IsPostBackチェックの外にリピータのデータバインディングを移動する必要があります。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) 
    fieldRepeater.DataSource = loadDataHere 
    fieldRepeater.DataBind 
End Sub 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim i As Integer = 0 
    For Each item As RepeaterItem In fieldRepeater.Items 
     Dim temp As DropDownList = CType(item.FindControl(("testField" + i.ToString)),DropDownList) 
     temp.BackColor = Color.Red 
     i = (i + 1) 
    Next 
End Sub 
+0

私はほぼそこにいた!私は 'fieldRepeater.item(i).findControl(" testField "&i)'に助けてくれました。 – Travis

+0

ようこそ。しかし、コントロールを 'itemtemplate'に直接置くこともできます。そうすれば、それらを動的に再作成する必要はありません。 – VDWWD

+1

理論的にははいですが、要素がリピーターにあるため、実際には必要ありません。彼らには一意の名前とIDが割り当てられます。そして、あなたは 'Button1_Click'の中でまったく同じものにアクセスすることができます:Dim temp As DropDownList = CType(item.FindControl((" DropDownList1 "))、DropDownList)' – VDWWD

関連する問題