如何动态加载时注册用户控件事件

时间:2014-07-17 14:12:39

标签: asp.net vb.net user-controls telerik

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

2 个答案:

答案 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