2011-12-28 6 views
0

(動的コントロール)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 
+0

通常の方法ではなく、なぜこのようにしていますか? – ivowiblo

+0

@ivowibloこのプロジェクトはすべて動的です。私は、コントロールを再作成する前に、コントロールの値(ドロップダウンリスト)を取得しようとしています。 – TroyS

+0

ああ、私はあなたが全体の例を変更したのを見て、今私にチェックさせてください:) – ivowiblo

答えて

0

の後ろです。あなたのコードは本当にそこで実行されなければなりませんか?ライフサイクルイベントに関するMSDNのthis articleを参照してください。

+0

その動的なコントロールと私はそれが処分される前にそれからテキストを取得する必要があります。 – TroyS

+0

私はPage_Loadイベントに入れても、コントロール名を取得しますが、パネルでそれを見つけることはできません。 – TroyS

+0

PreRenderに入れてみましたか?これはPage_Loadの後に実行されます – nycdan

-1

FlowLayoutPanel2は、クライアント側でのみ利用可能であるため、ページPre_initでは使用できません。なぜあなたは、あなたが選択オプションを使用する必要がある場合は、runat="server"および/またはサーバ側からそれらの両方にアクセスするために<div id="FlowLayoutPanel2"に追加を追加することで<selectにアクセスすることができます<asp:Dropdownlist>

を使用しないでください。

<div id="FlowLayoutPanel2" style="width:300px;padding-bottom:10px;padding-left:10px;padding-right:10px;" runat="server"> 
     <span>Select type of item:</span> 
     <select name="ctrl1" runat="server" ...> 
      <option selected="selected" value=""></option> 
      <option value="Item 1">Item 1</option> 
      <option value="Item 2">Item 2</option> 
      <option value="Item 3">Item 3</option> 
      <option value="Item 4">Item 4</option> 
     </select> 
    </div> 
+0

私はドロップダウンリストを使用しています。私が投稿したhtmlは、ブラウザでのデバッグを控えるソースコードでした。 – TroyS

+0

私はダイナミックコントロールがロードイベントで再作成される前に値を取得しようとしていました。それをどうやって行うのか分かりません。 – TroyS

+0

あなたのHTMLをソースファイルに投稿できますか? – Robert

0

初期イベントが最適です。 Pre-Initは私が推測するマスターページに使用されます。ビューステートは、Initイベントの前にロードされます。

0

私の提案は、初期化ではなく、負荷でコントロールを作成し、それらのすべてを作成することです。これにより、これらのオブジェクトのすべてのイベントが発生します(ViewStateを分析する前に作成するため)。次に、コントロール自体から必要な値を取得します。値によって異なるものを表示する必要がある場合は、すべてのオブジェクトを作成し、表示しないオブジェクトを非表示にします(.Visible = false)。彼らはレンダリングされず、ASP.NETレーダー上に置かれます。

関連する問題