2011-12-28 3 views
0

(Динамические элементы управления) На странице Pre_Init Я могу получить имя элемента управления с помощью следующего кода, но он не может найти элемент управления в панели, даже если он существует. Так почему же так? То, что мне нужно сделать, это получить значение контроля обратной связи до его удаления.Не удается найти элемент управления, хотя он существует Asp.Net

Примечание: это только образец.

Вот 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> 

Вот код За

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 Этот проект является динамичным. Я пытаюсь получить значение элемента управления (dropdownlist) до его воссоздания. – TroyS

+0

О, я вижу, вы изменили весь пример, позвольте мне проверить сейчас :) – ivowiblo

ответ

0

Вы могли бы быть в начале стадии обработки с Pre_Init. Действительно ли ваш код должен работать там? См. this article в MSDN о событиях жизненного цикла.

+0

Его динамический контроль, и мне нужно получить текст от него, прежде чем он будет удален. – TroyS

+0

Я даже поместил его в событие Page_Load, он получил контрольное имя, но не нашел его в панели. – TroyS

+0

Вы пробовали поместить его в PreRender? Это выполняется после Page_Load – nycdan

-1

FlowLayoutPanel2 не доступен на странице Pre_init, поскольку он доступен только на стороне клиента. Почему вы не используете <asp:Dropdownlist>

Если вы должны использовать выберите опцию вы можете получить доступ к <select путем добавления runat="server" и/или добавить его в <div id="FlowLayoutPanel2" доступ к обоим со стороны сервера.

<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

Событие Init - ваш лучший выбор. Предполагаю, что Pre-Init используется для основных страниц. Состояние представления загружается перед событием Init.

0

Мое предложение состоит в том, чтобы создать элементы управления в Init, а не в Load, и создать их все. Это приведет к тому, что все события этих объектов будут запущены (потому что вы создаете их перед анализом ViewState). Затем требуемое значение будет доступно из самого элемента управления. Если вам нужно показать что-то другое в зависимости от значения, создайте все объекты, а затем скройте тот, который вы не хотите показывать (.Visible = false). Они будут на радаре ASP.NET, кроме того, они не будут отображаться.

Смежные вопросы