我遇到的情况是我动态创建LinkButtons,基本上没有在PageInit上设置属性,然后在另一个单独按钮的click事件上添加有关这些LinkButtons的属性。(即文本,添加点击事件处理程序等)。
问题是,我必须点击LinkButton 两次才能触发点击事件处理程序。请记住,所有这些都在更新面板中。
在上下查看之后,我意识到我正在为它设置两次相同的ID(在PageInit上以及后来我设置属性时)。我看到了,并认为它会破坏控制层次结构中的东西,我理解这是问题...但我不完全理解的是 为什么 。
有人可以向我解释一下,为什么必须单击LinkButton两次以及为什么将ID设置为相同的两次会导致此问题的技术原因是什么?
CODE
这发生在CreateChildControls()
上Private Sub InitializeLinkBreadCrumbPlaceHolders()
Dim counter As Integer = 0
'Adding the handlers has to take place before/on Page.Init...
For counter = 0 To LEVEL_CAP
_linkDynamic = New LinkButton()
'Add all the links
Me._placeHolder.Controls.Add(_linkDynamic)
With _linkDynamic
AddHandler .Click, AddressOf Link_Click
.Style.Add("display", "none")
.ID = String.Format("lbl{0}", counter)
End With
Next
End Sub
当按下常规按钮时会发生这种情况(请记住所有这些都在更新面板中)
Private Sub SetHyperLinkBreadCrumbValues(Optional ByVal ShouldAddAsLink As Boolean = True)
'Don't add a new link if we went backwards
If ShouldAddAsLink Then
Me.Links(Me.CurrentLevel) = Me.LinkHeader
End If
'Go through the collection to set the values of the existing linkbuttons
For Each element As DictionaryEntry In Me.Links
'Links 1-based index
With CType(Me._placeHolder.Controls.Item(CInt(element.Key) - 1), LinkButton)
.Font.Name = "Arial"
.Font.Size = 11
If CInt(element.Key) > 1 Then
.Text = String.Format(" > {0}", CStr(element.Value))
Else
.Text = CStr(element.Value)
End If
.Visible = True
.Style.Add("display", "inline")
End With
Me.TrimDescriptionLink(CType(Me._placeHolder.Controls.Item(CInt(element.Key) - 1), LinkButton))
Next
End Sub
答案 0 :(得分:0)
我不时地看到(甚至造成)这种行为。不可避免地,您并不总是添加控件(或在OnClick
中连接PageInit
事件。第一次单击会导致PostBack
,在第二个服务器页面生命周期中,您可以在期间添加控件PageInit
。在第二次(和第二次按键点击)时,事件已连线并触发正确的事件。您是否可能不会在OnClick
期间每次都联系PageInit
事件?
你能分享一些代码吗?