質問:部分的なポストバックを発生させたコントロール*を特定するにはどうすればよいですか?
*control = Repeater コントロールによって動的に生成されたテキストボックス。
高レベル: 基本的に、Repeater コントロールをカプセル化する UpdatePanel があります。リピーターを使用して、テキスト ボックスとプレースホルダーを動的に追加します。
いずれかのテキスト ボックスの OnChange で、UpdatePanel.Load Sub が要求を行ったテキスト ボックスを特定できるようにして、適切なプレースホルダーに追加のコントロールを追加できるようにします (これも動的に追加されます)。
現時点でエラーが発生しています:「複数のコントロールに同じ ID 'X' が見つかりました。FindControl では、コントロールに一意の ID が必要です。
VB
Imports System.Data.SqlClient
Partial Class _Default
Inherits System.Web.UI.Page
Public RegisteredRows As New List(Of CustomRow)
Public callbackResult As String = ""
Public rptCount As Integer = 0
Public Class CustomRow
Public desc As String
End Class
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles dynForm.Load
Dim i As Integer
For i = 0 To 3
Dim cr As CustomRow = New CustomRow
cr.desc = ""
RegisteredRows.Add(cr)
Next
Repeater1.DataSource = RegisteredRows
Repeater1.DataBind()
Dim cm As ClientScriptManager = Page.ClientScript
dynLit.Text = "<script type='text/javascript' language='javascript'> function HandleDynamic() { __doPostBack('" & btnDynamic.ClientID & "', null);}</script>"
End Sub
Protected Sub DataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
If Not e.Item.DataItem Is Nothing Then
'Dim hdnBtn As Button = e.Item.FindControl("btnDynamic")
Dim tb As TextBox = e.Item.FindControl("asbText")
tb.Attributes.Add("onchange", "HandleDynamic();")
'tb.Attributes.Add("onchange", " __doPostBack('" & btnDynamic.ClientID & "', null);")
Repeater1.Controls.Add(tb)
If RegisteredRows Is Nothing Then
RegisteredRows = New List(Of CustomRow)
End If
End If
End Sub
Protected Sub upDynamic_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim uPanel As UpdatePanel = CType(sender, UpdatePanel)
If sender.ID = "upDynamic" Then
For i As Integer = 0 To uPanel.Controls.Count - 1
If TypeOf uPanel.Controls(i) Is TextBox AndAlso uPanel.Controls(i).ID = "asbText" Then
If CType(uPanel.Controls(i), TextBox).Text <> "" Then
Dim lbl As New Label
lbl.Text = "Comments"
Dim txt As New TextBox
txt.Width = 100
txt.Text = "Hello World"
Dim ph As New PlaceHolder
ph = CType(sender.FindControl("phDynamic"), PlaceHolder)
ph.Controls.Add(lbl)
ph.Controls.Add(txt)
End If
End If
Next
End If
End Sub
End Class
ASPX
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI" TagPrefix="asp" %>
<!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>Dyanmic Prototype</title>
</head>
<body>
<form id="dynForm" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" EnablePartialRendering="true" />
<div>
<table cellpadding="0" cellspacing="0">
<tr>
<td nowrap="nowrap">
<asp:Label ID="lblMain" runat="server" Text="Are we on?" ></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:UpdatePanel ID="upDynamic" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"
OnLoad="upDynamic_Load">
<ContentTemplate>
<asp:Repeater ID="Repeater1" runat="server" EnableViewState="false" OnItemDataBound="DataBound">
<HeaderTemplate>
<table>
<tr>
<td nowrap="nowrap">
<asp:Label ID="lblText" runat="server" Text="Offense" />
</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<table>
<tr>
<td>
<tr>
<td>
<asp:TextBox ID="asbText" runat="server" AutoComplete="Off" AutoCompleteType="Disabled"
EnableViewState="false" Width="350px"></asp:TextBox>
</td>
</tr>
<asp:PlaceHolder ID="phDynamic" runat="server" />
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
<asp:Button ID="btnDynamic" runat="server" Text="" Visible="false" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnDynamic" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
<asp:Literal runat="server" id="dynLit"></asp:Literal>