在 DataList HeaderTemplate 中找到控件
Find control in DataList HeaderTemplate
问题
如何根据 DataItem
的值更改 DataList
的 header 模板内控件的值?
我无法更改 ListItemType.HeaderItem
中的值,因为在绑定 ListItem
之前我也不知道要设置什么值。
ASP.NET
<asp:DataList ID="dl" runat="server" ShowHeader="true">
<HeaderTemplate>
<asp:Label ID="lbl" runat="server" Text="MyText" />
</HeaderTemplate>
<ItemTemplate>
</ItemTemplate>
</asp:DataList>
代码隐藏
Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim Type As Integer = e.Item.DataItem("Type")
If Type = 0 Then
'Change lbl text in HeaderTemplate
End If
End If
End Sub
Header 是其中一项,因此您需要遍历项目列表,找到 header 一项并使用 FindControl 获取标签。然而,这里的问题是,在数据绑定过程的任何时候,您都无法确定 header 项目是否已经绑定并且标签是否存在。通常你会发现它首先是数据绑定的,但在 API 中没有保证,所以你不应该依赖这种行为。
所以你可以做的是有一些 class 字段来存储你需要的文本,然后在数据绑定已经发生时在 PreRender 上设置这个文本。类似的东西(C#,但应该很容易翻译成 VB):
Private headerText as String
Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim Type As Integer = e.Item.DataItem("Type")
If Type = 0 Then
headerText = "SomeText"
End If
End If
End Sub
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
Dim item As DataListItem
For Each item In dl.items
If item.ItemType = ListItemType.Header Then
Dim HeaderLabel As Label = _
CType(item.FindControl("lbl"), Label)
HeaderLabel.Text = headerText
End If
Next item
End Sub
使用下面的代码:
Private headerItem As DataListItem
Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound
If e.Item.ItemType = ListItemType.Header Then
headerItem = e.Item
End If
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim Type As Integer = e.Item.DataItem("Type")
If Type = 0 Then
Dim lbl As Label = CType(headerItem.FindControl("lbl"), Label)
lbl.Text = "New Text"
End If
End If
End Sub
问题
如何根据 DataItem
的值更改 DataList
的 header 模板内控件的值?
我无法更改 ListItemType.HeaderItem
中的值,因为在绑定 ListItem
之前我也不知道要设置什么值。
ASP.NET
<asp:DataList ID="dl" runat="server" ShowHeader="true">
<HeaderTemplate>
<asp:Label ID="lbl" runat="server" Text="MyText" />
</HeaderTemplate>
<ItemTemplate>
</ItemTemplate>
</asp:DataList>
代码隐藏
Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim Type As Integer = e.Item.DataItem("Type")
If Type = 0 Then
'Change lbl text in HeaderTemplate
End If
End If
End Sub
Header 是其中一项,因此您需要遍历项目列表,找到 header 一项并使用 FindControl 获取标签。然而,这里的问题是,在数据绑定过程的任何时候,您都无法确定 header 项目是否已经绑定并且标签是否存在。通常你会发现它首先是数据绑定的,但在 API 中没有保证,所以你不应该依赖这种行为。
所以你可以做的是有一些 class 字段来存储你需要的文本,然后在数据绑定已经发生时在 PreRender 上设置这个文本。类似的东西(C#,但应该很容易翻译成 VB):
Private headerText as String
Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim Type As Integer = e.Item.DataItem("Type")
If Type = 0 Then
headerText = "SomeText"
End If
End If
End Sub
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
Dim item As DataListItem
For Each item In dl.items
If item.ItemType = ListItemType.Header Then
Dim HeaderLabel As Label = _
CType(item.FindControl("lbl"), Label)
HeaderLabel.Text = headerText
End If
Next item
End Sub
使用下面的代码:
Private headerItem As DataListItem
Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound
If e.Item.ItemType = ListItemType.Header Then
headerItem = e.Item
End If
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim Type As Integer = e.Item.DataItem("Type")
If Type = 0 Then
Dim lbl As Label = CType(headerItem.FindControl("lbl"), Label)
lbl.Text = "New Text"
End If
End If
End Sub