0

我在 aspx 页面的顶部动态构建 cookie 屑(链接按钮)。当用户单击此页面上的其他按钮时,会填充碎屑。每个面包屑都有一个超链接,因此用户可以单击它以返回到面包屑引用的部分。每次用户单击 owner.aspx 页面上应该更新面包屑的按钮时,我都会设置一个公共变量,并引用填充面包屑的 sub 中的变量。我为页面加载时的每个回发调用这个子。

我在 owner.aspx 中也有一个 people.ascx 控件,并且希望在用户单击 people.ascx 中的按钮时更新/填充 owner.aspx 中的 cookie 碎屑。

为此,我试图从 people.ascx 中引发 owner.aspx 中的事件。

  1. 在 people.ascx 中按钮的 onclick 子中,我引发了一个事件: RaiseEvent UpdateOwnerCookieCrumbs("2A") // 请注意,在此示例中我传递了一个变量“2A”。
  2. 在 people.ascx 的顶部,我使用以下命令声明事件:Public Event UpdateOwnerLandingPeopleCrumbs(PeopleCrumbID As String)
  3. 在 owner.aspx 的顶部,我声明了从 people.ascx 传递的变量: Public Property PeopleCrumbID As String
  4. 在 owner.aspx 的页面加载中,我添加了一个处理程序来调用事件:AddHandler ucPeople_e.UpdateOwnerLandingPeopleCrumbs, AddressOf Me.BuildCrumbs

问题的症结在于将变量从人传递给所有者。

owner.aspx 中的 BuildCrumbs 子是我动态构建 cookie 碎屑的地方,这些碎屑全部添加到 owner.aspx 的占位符中:

我用这样的代码构建了一个按钮:

mybtn2.ID = "btnOwnerPeopleEmployees_Crumb"
mybtn2.ToolTip = "Manage my business employees"
mybtn2.Text = "Employees"
AddHandler mybtn2.Click, AddressOf OwnerLandingPeopleRedir
CookieCrumbs.Controls.Add(mybtn2)

上面按钮构建中的 OwnerLandingPeopleRedir 是一个子项。因此,如果在 owner.aspx 中单击 cookie crumb 按钮,则应调用 OwnerLandingPeopleRedir 子程序。

问题?

当从 people.ascx 提出在 owner.aspx 中构建 cookie 碎屑的请求时,会发生 owner.aspx 的页面加载。页面加载调用 buildcrumbs sub(第一次)而不知道从 people.ascx 传递的 PeopleCrumbID 变量的值。然后引发 owner.aspx 中的事件处理程序,再次调用 buildcrumbs 子程序(第二次),这一次识别 PeopleCrumbID 变量。单步执行代码看起来都不错。但是,当我在回发后单击 owner.aspx 中的 cookie crumb 按钮时,该按钮的超链接不会调用 OwnerLandingPeopleRedir 子。因此,当代码第二次通过 buildcrumbs 运行时,超链接就会丢失。

我尝试从页面初始化事件和所有其他可能的事件中调用 BuildCrumbs Sub,以查看在页面生命周期的早期构建碎屑是否会有所帮助,但这并没有什么不同。

我还尝试更改我的代码以为 peoplecrumb 设置会话变量,而不是通过 raiseevent 传递它,但这也不起作用。在这种情况下,我发现如果我单击一个按钮 2 次,cookie crumbs 将成功构建......编程将在第一次通过时记住旧的会话变量值,并成功应用它来构建 crumbs ...... grrrr。

有谁知道如何帮助我克服这个困难?请!:)

4

1 回答 1

0

我想我知道你在做什么导致你的问题。不过,为了确保我理解......您已经构建了一个自定义控件(一个 .ascx),您通过将其添加到占位符控件来动态地将其添加到 Web 表单中。但是,当用户与自定义控件交互时,事件不会被引发到父级。

我认为您在这里有了一个良好的开端,但我想就稍微不同的方法提出建议。它还可能会稍微清理您的代码,并使您不必在一个页面生命周期内构建两次控件。

首先,将您的“BuildCrumbs”子更改为以下内容(您可能需要更改“Dim mybtn2”行以匹配您项目的详细信息):

Private Sub BuildCrumbs(IsNewControl As Boolean)
    Dim mybtn2 As People = LoadControl("~/controls/people.ascx")

    mybtn2.ID = "btnOwnerPeopleEmployees_Crumb"

    If IsNewControl Then
        mybtn2.ToolTip = "Manage my business employees"
        mybtn2.Text = "Employees"
    End If

    AddHandler mybtn2.Click, AddressOf OwnerLandingPeopleRedir
    CookieCrumbs.Controls.Add(mybtn2)
End Sub

接下来,删除 Page_Load 中调用 BuildCrumbs 的代码,而是将其放在占位符的 init 事件中:

Private Sub CookieCrumbs_Init(sender As Object, e As EventArgs) Handles CookieCrumbs.Init
    BuildCrumbs(Not Page.IsPostBack)
End Sub

动态控件的工作方式是,第一次将其添加到表单时,您需要创建有关它的所有内容,例如设置其 ID、ToolTip 和 Text 属性。但是,在回发时,您只需创建带有 ID 属性集的控件并将其添加到页面上的相同位置,页面的 ViewState 处理将使用其正确值重新填充控件。

我有一个示例项目,如果您需要进一步说明,我可以提供给您。

于 2013-09-10T20:54:55.450 回答