我相信这个问题已经被问了无数次,但我还没有找到解决我的问题的答案。
我正在以编程方式向一个简单的aspx页面上的PlaceHolder添加一些自定义用户控件。所有用户控件的Postback都能正常工作,除了其中一个带有GridView的控件。
由于某种原因,从此控件内部触发的任何postback,在第一次点击时不会调用指定的事件,但是在之后的所有点击中都能正常工作。我不知道为什么会出现这种情况,但我找到的许多解决方案都建议给ascx用户控件添加一个ID,但在我的情况下这并不起作用。
我查看了在第一次点击之前和之后生成的页面的源文件,用于调用postback的javascript发生了变化,即:
第一次点击之前:onclick="javascript:__doPostBack('tmpControlID$sgvPrimaryEmploymentHistory','Select$0')"
第一次点击之后:onclick="javascript:__doPostBack('OFFHome1$tmpControlID$sgvPrimaryEmploymentHistory','Select$0')"
OFFHome1是存在于aspx页面上的父用户控件。所有其他控件都添加到该控件中的占位符中。
我正在以编程方式向一个简单的aspx页面上的PlaceHolder添加一些自定义用户控件。所有用户控件的Postback都能正常工作,除了其中一个带有GridView的控件。
由于某种原因,从此控件内部触发的任何postback,在第一次点击时不会调用指定的事件,但是在之后的所有点击中都能正常工作。我不知道为什么会出现这种情况,但我找到的许多解决方案都建议给ascx用户控件添加一个ID,但在我的情况下这并不起作用。
我查看了在第一次点击之前和之后生成的页面的源文件,用于调用postback的javascript发生了变化,即:
第一次点击之前:onclick="javascript:__doPostBack('tmpControlID$sgvPrimaryEmploymentHistory','Select$0')"
第一次点击之后:onclick="javascript:__doPostBack('OFFHome1$tmpControlID$sgvPrimaryEmploymentHistory','Select$0')"
OFFHome1是存在于aspx页面上的父用户控件。所有其他控件都添加到该控件中的占位符中。
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="OFFHome.ascx.vb" Inherits="UmbracoUserControls.OFFHome" %>
<asp:PlaceHolder ID="phOFFSection" runat="server"></asp:PlaceHolder>
内容不太复杂。然后在代码后台,使用以下方法将控件加载到占位符中:
Private Sub LoadNextOFFStep()
Dim ControlName As String = "TestControl.ascx"
phOFFSection.Controls.Clear()
If ControlName IsNot Nothing AndAlso ControlName <> String.Empty Then
Dim NewControl As Object = LoadControl(ControlName)
With NewControl
.ID = USERCONTROLNAME
Dim StepCompleted As Boolean = .FillControl()
If StepCompleted Then
Exit Sub
End If
Dim AllowSkip As Boolean = .AllowSkip()
btnSkip.Visible = AllowSkip
End With
phOFFSection.Controls.Add(NewControl)
End If
End Sub
这并不是什么太复杂的问题。USERCONTROLNAME只是一个常量,其值为"tmpControlID"。
导致我困扰的控件有点复杂,我最初使用的是我们创建的自定义GridView控件,但已将其替换为标准的asp控件以查看问题是否仍然存在,结果仍然存在。
任何触发postback的控件上的按钮都会在第一次失败,而所有后续点击都将正常工作。在第一次点击时,只会调用Page_Load事件。
我做错了什么?
LoadNextOFFStep()
函数? - o.k.w