我有一个带两个下拉列表的.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