我有一个带有两个下拉菜单的.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 :(得分:0)
我在.aspx页面的公共类部分中声明了我的控件,如下所示:
Dim lodgingControl As UserControl = DirectCast(Page.LoadControl("~/Clients/lodging.ascx"), UserControl)
在page_Init部分的aspx页面中,我只是在控件中添加了一个id:
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
答案 1 :(得分:0)
动态创建的控件必须具有ID,并且它们不得在回发之间更改。
另外,如果可能的话,尝试在Page_Init中加载它们,以便它们在ViewState和ClientState加载之前可用。
第三件事是,不要对RadAjaxPanel使用AJAX设置,删除其中一个:http://www.telerik.com/help/aspnet-ajax/ajax-controls-in-ajaxpanel-and-ajaxsettings.html。