2014-07-17 63 views
0

我有一个带两个下拉列表的.aspx页面,用于控制哪个用户控件使用占位符动态添加到页面中。我有两个下拉菜单,用户选择一个值并加载另一个。我有第二个下拉值被传递来加载正确的用户控件。在用户从第二个下拉列表中选择一个值后,用户控件显示它已经加载,但是当用户单击用户控件上的下拉列表时,selectedIndexChanged事件不会触发第一个选择和用户选择的值不保留。一旦用户选择一个值,页面看起来像回发,并且值被存储并且在第二选择的下拉列表中正确显示。这里是我简化后的.aspx页面,显示两个下拉菜单以及下方的代码。如何在动态加载时注册用户控件事件

<%@ Page Title="Add New Property" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="addProperty.aspx.vb" Inherits="project.addProperty" %> 
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> 
<%@ Register Src="~/Clients/lodging.ascx" TagPrefix="uc1" TagName="lodging" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> 
<style type="text/css"> 
    .auto-style1 { 
     height: 20px; 
    } 
</style> 
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server"> 
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> 
    <AjaxSettings> 
     <telerik:AjaxSetting AjaxControlID="RadAjaxPanel1"> 
      <UpdatedControls> 
       <telerik:AjaxUpdatedControl ControlID="RadAjaxPanel1" LoadingPanelID="RadAjaxLoadingPanel1" UpdatePanelCssClass="" /> 
      </UpdatedControls> 
     </telerik:AjaxSetting> 
    </AjaxSettings> 
</telerik:RadAjaxManager> 

<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" Width="100%"> 
<table style="width:100%;"> 
    <tr> 
     <td class="auto-style1" style="text-align: right"> 
      Property Type</td> 
     <td> 
      <telerik:RadDropDownList ID="dd_ID_Const_PropertyType" runat="server" AppendDataBoundItems="True" Skin="WebBlue" DataSourceID="sql_getPropertyType" DataTextField="PropertyType" DataValueField="ID_Const_PropertyType" AutoPostBack="True" RenderMode="Auto" CausesValidation="False"> 
       <Items > 
        <telerik:DropDownListItem Text="Select Property Type..." Value=0 /> 
       </Items> 
      </telerik:RadDropDownList> 
     </td> 
     <td class="auto-style4" style="text-align: right">Property Subtype</td> 
     <td> 
      <telerik:RadComboBox ID="dd_ID_Const_PropertySubType" Runat="server" AppendDataBoundItems="True" AutoPostBack="true" 
       Skin="WebBlue" DropDownAutoWidth="Enabled" MaxHeight="250px" Width="300px" 
       RenderMode="Auto" CausesValidation="False" > 
       <Items> 
        <telerik:RadComboBoxItem Text="First Select Property Type..." Value=0 /> 
       </Items> 
      </telerik:RadComboBox> 
     </td> 
    </tr><tr> 
      <td colspan="4"> 
       <asp:PlaceHolder ID="ph_propertiesSubType" runat="server" EnableViewState="false"></asp:PlaceHolder> 
      </td> 
     </tr> 
    <tr> 
</table> 
</telerik:RadAjaxPanel> 
</asp:Content> 

这里是我的代码后面的aspx页面。它比这更复杂,但我试图让我很容易理解我在做什么。这个代码是当用户选择从第二下拉父页上的值(不包括用于第一下拉因为正常工作所选择的指数变化码)

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If IsPostBack Then 
     Select Case ("Session")propertySubType 
      Case 1 
       ph_propertiesSubType.Controls.Add(lodgingControl) 
      Case Else 
       ph_propertiesSubType.Controls.Clear() 
     End Select 
    End If 
End Sub 

    Private Sub dd_ID_Const_PropertySubType_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs) Handles dd_ID_Const_PropertySubType.SelectedIndexChanged 

    ("Session")propertySubType = 1 


    'add property subtype indexes to reference 
    Select Case ("Session")propertySubType 
     Case 1 
      ph_propertiesSubType.Controls.Add(lodgingControl)   
     Case Else 
      ph_propertiesSubType.Controls.Clear() 
    End Select 

End Sub 

一旦用户选择用户控件的适当值会动态添加到页面中。这是我的用户控制代码。

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="lodging.ascx.vb" Inherits="project.lodging" %> 
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> 

<style type="text/css"> 
    .auto-style1 { 
     height: 25px; 
     text-align: right; 
    } 
    </style> 

<table> 
<tr> 
      <td class="auto-style1">Interior or Exterior Room Entrance</td> 
      <td> 
       <telerik:RadDropDownList ID="dd_ID_Const_RoomEntrance" runat="server" AutoPostBack="true" 
        AppendDataBoundItems="True" CausesValidation="False" Skin="WebBlue" 
        SelectedText="Select Market Type..." SelectedValue="0"> 
        <Items> 
         <telerik:DropDownListItem Text="Select Market Type..." Value="0" Selected="True" /> 
        </Items> 
       </telerik:RadDropDownList> 
      </td> 
     </tr> 
</table> 
<asp:SqlDataSource ID="sql_roomEntrance" runat="server" 
     SelectCommand="SELECT ID_Const_RoomEntrance, roomEntrance, Active 
FROM Const_RoomEntrance 
WHERE Active = 'True' 
ORDER BY roomEntrance ASC"></asp:SqlDataSource> 

而后面的代码为用户控制。我启动我的数据库值,并正确加载。我遇到的问题是,当用户在页面上加载用户控件后立即进入下拉列表时,第一次选择的索引事件不会触发用户控件下拉列表值。它像事件尚未注册,我想知道如何注册它们。或者如何提升可能尚未完全加载的事件。我有我的自动发布后台设置其像我的页面结构加载,但代码不会与它一起进入,直到另一个回发。当我在selectedIndexChange事件上设置断点时,它们在第一次选择时不会被触发,我认为这意味着它们最初不可用或加载,但断点在第二次选择时会触发。

Imports System.Data.SqlClient 
    Imports System.Data.Sql 
    Imports Microsoft.VisualBasic 
    Imports System.Data 
    Imports System 
    Imports System.Data.OleDb 
    Imports System.Collections.Generic 
    Imports System.Text 
    Imports System.IO 
    Imports System.Web 

    Imports Telerik 
    Imports Telerik.Web 
    Imports Telerik.Web.UI 

Public Class lodging 
    Inherits System.Web.UI.UserControl 
    Dim querystring As String = "" 
    Dim tempTable As New DataTable 
    Dim currentDate As String = DateTime.Now.ToString("yyyy-MM-dd") 

Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init 
     dd_ID_Const_RoomEntrance.DataSource = sql_roomEntrance 
     dd_ID_Const_RoomEntrance.DataTextField = "roomEntrance" 
     dd_ID_Const_RoomEntrance.DataValueField = "ID_Const_RoomEntrance" 
     dd_ID_Const_RoomEntrance.DataBind() 
End Sub 

Public Sub dd_ID_Const_RoomEntrance_SelectedIndexChanged(sender As Object, e As DropDownListEventArgs) Handles dd_ID_Const_RoomEntrance.SelectedIndexChanged 

     If dd_ID_Const_RoomEntrance.SelectedValue <> 0 Then 
      Session("lodgingRoomEntrance") = dd_ID_Const_RoomEntrance.SelectedValue 
     Else 
      Session("LodgingRoomEntrance") = 0 
     End If 

    End Sub 

回答

0

我宣布我的控制中这样我的.aspx页面中的公共类部分:

Dim lodgingControl As UserControl = DirectCast(Page.LoadControl("~/Clients/lodging.ascx"), UserControl) 

在page_Init部分我简单地添加一个id这样控制aspx页面内:

lodgingControl.ID = 1 

和控件在第一次选择时触发。我不知道这是否是这样做的正确方法,但我的控制似乎正在通过他们的事件。

Public Class addProperty 
Inherits System.Web.UI.Page 
Dim lodgingControl As UserControl = DirectCast(Page.LoadControl("~/Clients/lodging.ascx"), UserControl) 

Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init 

     lodgingControl.ID = 1 
     shoppingCenterControl.ID = 2 

    End Sub 
相关问题