(動的コントロール)Page Pre_Init次のコードを使用してコントロールの名前を取得できますが、コントロールが存在する場合でもパネルでそのコントロールを見つけることはできません。だからなぜそれがあろうか?私がする必要があるのは、処分される前にポストバックコントロールの価値を得ることです。FindControlが存在する場合でもFindControlが見つかりません。
注:これはサンプルです。ここで
HTML
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm2.aspx.vb" Inherits="DynamicControls_GetControlUnloaded.WebForm2" %>
<!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:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div style="width: 200px;">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
は、ここでのコードは、早期Pre_Initと処理ステップである可能性があり
Public Class WebForm2
Inherits System.Web.UI.Page
Dim current_val As Object
Private Sub WebForm2_PreInit(sender As Object, e As System.EventArgs) Handles Me.PreInit
Dim postback_control As Control = GetPostBackControl(Me.Page)
If postback_control IsNot Nothing Then
Select Case postback_control.GetType
Case GetType(DropDownList)
current_val = CType(postback_control, DropDownList).Text
Case GetType(TextBox)
current_val = CType(postback_control, TextBox).Text
Case GetType(CheckBox)
current_val = CType(postback_control, CheckBox).Checked
Case GetType(RadioButton)
current_val = CType(postback_control, RadioButton).Checked
End Select
End If
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Create Dynamic controls
Call BuildControls()
End Sub
Private Sub BuildControls()
For i As Integer = 0 To 2
Dim ddl As New DropDownList
ddl.Items.Add("Item 1")
ddl.Items.Add("Item 2")
ddl.Items.Add("Item 3")
ddl.Style.Add("margin", "3px")
ddl.ID = "Ctrl" & i.ToString
ddl.AutoPostBack = True
ddl.Width = 150
PlaceHolder1.Controls.Add(ddl)
Next
End Sub
Public Shared Function GetPostBackControl(ByVal thePage As Page) As Control
Dim myControl As Control = Nothing
Dim ctrlName As String = thePage.Request.Params.Get("__EVENTTARGET")
If ((ctrlName IsNot Nothing) And (ctrlName <> String.Empty)) Then
myControl = thePage.FindControl(ctrlName)
Else
For Each Item As String In thePage.Request.Form
Dim c As Control = thePage.FindControl(Item)
If (TypeOf (c) Is System.Web.UI.WebControls.Button) Then
myControl = c
End If
Next
End If
Return myControl
End Function
End Class
通常の方法ではなく、なぜこのようにしていますか? – ivowiblo
@ivowibloこのプロジェクトはすべて動的です。私は、コントロールを再作成する前に、コントロールの値(ドロップダウンリスト)を取得しようとしています。 – TroyS
ああ、私はあなたが全体の例を変更したのを見て、今私にチェックさせてください:) – ivowiblo